我怎样才能一次循环两个数组?
我试图安排两个arrays在一起,结果不断出现不正确。 我会告诉你我的代码,我得到的结果和我正在寻找的结果。
我想我只是做错了,但不知道该怎么做。
我的代码:
$data1 = [ 'a: 1', 'a: 2', 'a: 3', 'a: 4', 'a: 5' ]; $data2 = [ 'b: 1', 'b: 2', 'b: 3', 'b: 4', 'b: 5' ]; foreach($data1 as $item1) { foreach($data2 as $item2) { echo $item1 . '<br/>'; echo $item2 . '<br/>'; echo '<br/><br/>'; } }
结果:(缩短了节省空间)
a: 1 b: 1 a: 1 b: 2 a: 1 b: 3 a: 1 b: 4 a: 1 b: 5
我正在寻找的结果如下:
a: 1 b: 1 a: 2 b: 2 a: 3 b: 3 a: 4 b: 4 a: 5 b: 5
问题
那么问题当然是你的嵌套的foreach循环。 因为对于你的$data1
数组的每个元素,你循环遍历整个$data2
数组(所以总共有$data1
* $data2
迭代)。
解决scheme
要解决这个问题,你必须一次循环两个数组。
array_map()
方法(PHP> = 5.3)
你可以用array_map()
来做到这一点,并将所有的数组传递给你想要同时循环的数组。
array_map(function($v1, $v2){ echo $v1 . "<br>"; echo $v2 . "<br><br>"; }, $data1, $data2 /* , Add more arrays if needed manually */);
注意:如果元素数量不均匀,则不会产生任何错误,只会打印NULL
(意思是你什么都看不到)
MultipleIterator
方法(PHP> = 5.3)
使用MultipleIterator
并根据需要添加尽可能多的ArrayIterator
。
$it = new MultipleIterator(); $it->attachIterator(new ArrayIterator($data1)); $it->attachIterator(new ArrayIterator($data2)); //Add more arrays if needed foreach($it as $a) { echo $a[0] . "<br>"; echo $a[1] . "<br><br>"; }
注意:如果元素数量不均匀,则只会打印两个数组仍然有值的所有值
for loop
方法(PHP> = 4.3)
使用一个计数器variables的for循环,你可以用它作为两个数组的键。
$keysOne = array_keys($data1); $keysTwo = array_keys($data2); $min = min(count($data1), count($data2)); for($i = 0; $i < $min; $i++) { echo $data1[$keysOne[$i]] . "<br>"; echo $data2[$keysTwo[$i]] . "<br><br>"; }
注意:使用array_keys()
就是这样,如果数组没有相同的键或关联,这也是array_keys()
。 min()
仅用于循环每个数组所具有的元素数量
array_combine()
方法(PHP> = 5.0)
或者,如果数组只有唯一值,则可以使用array_combine()
这两个数组,以便$data1
可以作为键访问, $data2
作为值访问。
foreach(array_combine($data1, $data2) as $d1 => $d2) { echo $d1 . "<br>"; echo $d2 . "<br><br>"; }
注意:数组必须具有相同数量的元素,否则array_combine()
会引发错误
call_user_func_array()
方法(PHP> = 5.6)
如果您想要同时打印两个以上的数组,或者只是未知数量的数组,您可以将array_map()
方法与call_user_func_array()
调用结合使用。
$func = function(...$numbers){ foreach($numbers as $v) echo $v . "<br>"; echo "<br>"; }; call_user_func_array("array_map", [$func, $data1, $data2]);
注意:由于这种方法使用array_map()
方法,因此其行为与不均匀的元素数量相同。 此外,由于此方法只适用于PHP> = 5.6,您可以删除参数,并在foreach循环中用func_get_args()
更改$numbers
,然后它也适用于PHP> = 5.3
使用1的键获得2的行
foreach($data1 as $k=> $item1) { echo $item1 . '<br/>'; echo $data2[$k] . '<br/>'; echo '<br/><br/>'; }