Я пытаюсь собрать два массива вместе, и результаты остаются неправильными. Я покажу вам свой код, результаты, которые я получаю, и результаты, которые я ищу.
Наверное, я просто делаю это неправильно, но не знаю, как это сделать.
Мой код:
$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
итерации).
Чтобы решить эту проблему, вам необходимо сразу пропустить оба массива.
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 */);
на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>"; }
на$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
метода for loop
(PHP> = 4.3) Используйте цикл 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>"; }
на$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()
заключается в том, что это также работает, если массивы не имеют одинаковых ключей или являются ассоциативными. 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>"; }
на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]);
Примечание. Поскольку этот метод kinda использует метод array_map()
, он ведет себя одинаково с неравномерным количеством элементов. Кроме того, поскольку этот метод работает только для PHP> = 5.6, вы можете просто удалить аргументы и изменить $numbers
с помощью func_get_args()
в цикле foreach, а затем он также работает для PHP> = 5.3
используйте ключ от 1, чтобы получить строку в 2
foreach($data1 as $k=> $item1) { echo $item1 . '<br/>'; echo $data2[$k] . '<br/>'; echo '<br/><br/>'; }