php - How to unset foreach loop main array (the one is being iterated) inside the loop itself? -
i have 2 foreach loops below.
the idea process type 2 before type 1 in order. code below works fine wondering how can use unset achieve same result instead of using array $processed keep track of processed.
i know php foreach clones/copies $data array iteration. in other words, possible unset type 2 $data in second foreach loop , somehow first foreach loop skip them?
i know php foreach clones/copies array iteration.
$data = array( array('type' => 1), array('type' => 2), array('type' => 2), array('type' => 2), array('type' => 1), array('type' => 2), array('type' => 2), ); $processed = array(); foreach ($data $firstkey => $firstvalue) { if (in_array($firstkey, $processed)) { continue; } foreach ($data $secondkey => $secondvalue) { if ($secondvalue['type'] == 2) { echo $secondvalue['type'] . " processed " . "<br/>"; $processed[] = $secondkey; // can use unset here? } } echo $firstvalue['type'] . " processed" . "<br/>"; } update update can intention out.
each child has reference parent. children need processed before parent. code below should work fine. can try , output of code below desired behavior. unset if possible.
$data = array( array('id' => 1, 'ref' => null, 'name' => 'parent 1'), array('id' => 2, 'ref' => 1, 'name' => 'child 1'), array('id' => 3, 'ref' => 1, 'name' => 'child 2'), array('id' => 4, 'ref' => 1, 'name' => 'child 3'), array('id' => 5, 'ref' => null, 'name' => 'parent 2'), array('id' => 6, 'ref' => 5, 'name' => 'child 1'), array('id' => 7, 'ref' => 5, 'name' => 'child 2'), array('id' => 8, 'ref' => null, 'name' => 'parent 3'), array('id' => 9, 'ref' => 8, 'name' => 'child 1'), array('id' => 10, 'ref' => 8, 'name' => 'child 2'), ); $processed = array(); foreach ($data $ref => $firstvalue) { if (in_array($ref, $processed)) { continue; } foreach ($data $secondkey => $secondvalue) { if ($secondvalue['ref'] == $firstvalue['id']) { echo $secondvalue['id'] . "- " . $secondvalue['name'] . " processed " . "<br/>"; $processed[] = $secondkey; } } echo $firstvalue['id'] . "- " . $firstvalue['name'] . " processed" . "<br/>"; echo "<hr/>"; } code above output:
2- child 1 processed 3- child 2 processed 4- child 3 processed 1- parent 1 processed 6- child 1 processed 7- child 2 processed 5- parent 2 processed 9- child 1 processed 10- child 2 processed 8- parent 3 processed
here's simpler version doesn't require unsetting anything. tests type. each type 1 entry, processes type 2 entries first, processes type 1 entry.
<?php $data = array( array('type' => 1), array('type' => 2), array('type' => 2), array('type' => 2), array('type' => 1), array('type' => 2), array('type' => 2), ); foreach ($data $firstkey => $firstvalue) { if ($firstvalue['type'] == 1) { foreach ($data $secondkey => $secondvalue) { if ($secondvalue['type'] == 2) { echo $secondvalue['type'] . " processed " . "<br/>"; } } echo $firstvalue['type'] . " processed" . "<br/>"; } } another way this, doesn't require testing types in inner loops, make 2 arrays: $datatype1 contains type 1 entries in $data, , $datatype2 contains type 2 entries. use simple nested loops:
foreach ($datatype1 $firstvalue) { foreach ($datatype2 $secondvalue) { echo $secondvalue['type'] . " processed " . "<br/>"; } echo $firstvalue['type'] . " processed" . "<br/>"; }
Comments
Post a Comment