rbur0425
rbur0425

Reputation: 479

Recursive Array Cleanup

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;

}

Upvotes: 0

Views: 52

Answers (1)

DiddleDot
DiddleDot

Reputation: 744

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);

Upvotes: 1

Related Questions