PHP объединяет массивы по значению

#php #arrays #merge

#php #массивы #слияние

Вопрос:

Я знаю, что это довольно легко сделать с помощью процедуры a foreach , затем a while -> list и т. Д. (я уже выполнил это), однако я чувствую, что мой код немного грязный, и он не выглядит как лучшее решение… Я собираюсь использовать собственные функции массива PHP для выполнения следующих действий:

У меня есть два массива, которые выглядят следующим образом:

[0] (Массив)#2
 [ранг] "579"
 [id] "1"
[1] (Массив) #4
 [ранг] "251"
 [id] "2"

[0] (Массив)#2
 [размер] "S"
 [статус] "A"
 [id] "1"
[1] (Массив)#15
 [размер] "L"
 [статус] "A"
 [id] "2"

И в результате мне нужно что-то вроде следующего:

[0] (Массив)#2
 [размер] "S"
 [статус] "A"
 [id] "1"
 [ранг] "579"

[1] (Массив)#2
 [размер] "L"
 [статус] "A"
 [id] "2"
 [ранг] "251"

Есть ли способ объединить два массива со id значением (или любым другим), не переходя к бесконечному набору foreach s?

Комментарии:

1. Являются ли элементы с одинаковым идентификатором с одинаковым индексом в обоих массивах? Другими словами, если элемент с идентификатором 5 имеет индекс 3 в первом массиве, будет ли он также иметь индекс 3 во втором массиве?

Ответ №1:

Используйте array_merge_recursive()

 $array = array_merge_recursive($array1, $array2);
 

или создайте свою собственную функцию (это может быть быстрее)

 function my_array_merge(amp;$array1, amp;$array2) {
    $result = Array();
    foreach($array1 as $key => amp;$value) {
        $result[$key] = array_merge($value, $array2[$key]);
    }
    return $result;
}
$array = my_array_merge($array1, array2);
print_r($array);
 

Комментарии:

1. Потрясающе!, спасибо за это, к вашему сведению: функциональный подход работает отлично, если вам нужно отбросить те записи, которые не повторяются в обоих массивах.

2. Технически это не отвечает на вопрос. @OsvaldoM. хочет объединяться на основе значения id, а не по ключам.

Ответ №2:

Как заметил Рэй в комментарии, принятый ответ на самом деле не отвечает на вопрос. Я не смог найти ответ, поэтому я создал следующую небольшую служебную функцию:

 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'];
});
 

Ответ №3:

Удачного слияния массивов, как в других языках. Это потому, что 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]) amp;amp; $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;
  }
 

Ответ №4:

 function custom_array_merge(amp;$array1, amp;$array2) {
    $result = Array();
    foreach ($array1 as $key_1 => amp;$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, amp;$array2 и измените $value_2[‘name’] // имя, на основе которого вы хотите объединить.

Ответ №5:

хорошо, давайте предположим, что ваши массивы называются $ arr1 и $ arr2, вы могли бы сделать это:

 <?php
$newarray = Array();
foreach ($arr1 as $element=>$value){
    $newarray = array_merge($arr1[$element],$arr2[$element])
}
?>