0

I have a function called combined which is going to loop through an array of orders. It is specifically searching for someone who placed more than 1 order and matches based on the customer's name and address line 1. If the customer places 2 orders this will catch them and combine them however if they have 3 or more if only catches 2. When I recursively call the function I get an invalid offset error which I do not understand as I thought the array index would refresh on every function call?

function combined(Array $all) {
//find any matching single orders and combine
$count = count($all);
$combinedorder = array();
for($i=1; $i < $count; $i++) {
    for($j=1; $j < $count; $j++) {
        //if order # is not the same
        if(strcasecmp($all[$i][0], $all[$j][0]) !== 0){ 
          //if name matches
            if(strcasecmp($all[$i][2], $all[$j][2]) == 0) {
              //if address line 1 matches
                if(strcasecmp($all[$i][3], $all[$j][3]) == 0) {
                    $combinedorder[] = array('ordernos' => array($all[$i][0], $all[$j][0]), $all[$i][1], $all[$i][2], $all[$i][3], $all[$i][4], $all[$i][5], $all[$i][6], $all[$i][7], $all[$i][8], $all[$i][9], $all[$i][10], 'orders' => array($all[$i][11], $all[$j][11]));

                    unset($all[$i]);
                    unset($all[$j]);

                    $all = array_merge($all, $combinedorder);
                    $all = array_values($all);
                    reset($all);
             //this recursive call does not work. undefined offset error
                    combined($all);
                }
             }
          }
    }
}
return $all;

}

1
  • You need to show an example of the array and what it should look like modified. Commented Mar 22, 2017 at 18:35

1 Answer 1

1

You need to re-index the array. You are deleting some of the indexes with unset($all[$i]) and unset($all[$j]). So when the function calls itself and your loop hits the index that you deleted you get the invalid offset error.

To fix it just add this code after you unset some of the indexes to reset the keys of the array.

$all = array_values($all);
Sign up to request clarification or add additional context in comments.

4 Comments

I am still getting error PHP Notice: Undefined offset: 91
Can you print_r($all) before you call combine() the first time and then print_r($all) after you you array_merge inside the combine function. Then kill the script before it calls combine() again and edit the results into your question?
I got it. Had to reset the count variable with $count = count($all) after doing the array_values($all). Works well!
That makes sense. I forgot about $count.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.