Я знаю, что это довольно легко выполнить с помощью foreach
, затем while
-> list и т. Д. (Я уже это сделал), однако я чувствую, что мой код немного грязный, и это не похоже на лучшее решение. .. Я ищу, чтобы использовать собственные функции массива PHP, чтобы сделать следующее:
У меня есть два массива, которые выглядят так:
[0] (массив) # 2 [ранг] "579" [id] "1" [1] (массив) # 4 [rank] "251" [id] "2" [0] (массив) # 2 [размер] "S" [status] "A" [id] "1" [1] (массив) # 15 [размер] "L" [status] "A" [id] "2"
И мне нужно в результате что-то вроде следующего:
[0] (массив) # 2 [размер] "S" [status] "A" [id] "1" [ранг] "579" [1] (массив) # 2 [размер] "L" [status] "A" [id] "2" [rank] "251"
Есть ли способ объединить два массива с id
значением (или другим), не вдаваясь в бесконечный набор foreach
s?
Использовать array_merge_recursive ()
$array = array_merge_recursive($array1, $array2);
или сделать свою собственную функцию (она может быть быстрее)
function my_array_merge(&$array1, &$array2) { $result = Array(); foreach($array1 as $key => &$value) { $result[$key] = array_merge($value, $array2[$key]); } return $result; } $array = my_array_merge($array1, array2); print_r($array);
ok, давайте предположим, что ваши массивы называются $ arr1 и $ arr2, вы можете сделать это:
<?php $newarray = Array(); foreach ($arr1 as $element=>$value){ $newarray = array_merge($arr1[$element],$arr2[$element]) } ?>
Как заметил Рэй в комментарии, принятый ответ на самом деле не отвечает на вопрос. Мне не удалось найти ответ, поэтому я создал следующую небольшую служебную функцию:
function array_merge_callback($array1, $array2, $predicate) { $result = array(); foreach ($array1 as $item1) { foreach ($array2 as $item2) { if ($predicate($item1, $item2)) { $result[] = array_merge($item1, $item2); } } } return $result; }
Используйте его следующим образом:
array_merge_callback($array1, $array2, function ($item1, $item2) { return $item1['id'] == $item2['id']; });
Имейте хороший способ слить массивы, как другие языки. Это связано с тем, что php имеет элементы массива с нумерацией, а слияние будет дублировать или заменять разные элементы ключами.
Теперь это изменилось.
// array_fork public static function array_fork() { $args = func_get_args(); $result = array(); foreach ($args as $arr) { is_array($arr) || exit('[' . __METHOD__ . '] Each item must be an array.'); foreach ($arr as $key => $val) { if (is_array($val)) { // recursion !isset($result[$key]) && $result[$key] = array(); $result[$key] = self::array_fork($result[$key], $arr[$key]); continue; } if (is_numeric($key)) { if (!in_array($arr[$key], $result)) $result[] = $arr[$key]; } else $result[$key] = $arr[$key]; } } return $result; }
function custom_array_merge(&$array1, &$array2) { $result = Array(); foreach ($array1 as $key_1 => &$value_1) { // if($value['name']) foreach ($array2 as $key_1 => $value_2) { if($value_1['name'] == $value_2['name']) { $result[] = array_merge($value_1,$value_2); } } } return $result; }
// Передаем $ array1, & $ array2 и изменяем имя $ value_2 ['name'] //, на основе которого вы хотите объединиться.