PHP поєднує два асоціативні масиви в один масив


85
$array1 = array("$name1" => "$id1");

$array2 = array("$name2" => "$id2", "$name3" => "$id3");

Мені потрібен новий масив, що поєднує всі разом, тобто це буде

$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");

Який найкращий спосіб це зробити?

Вибачте, я забув, ідентифікатори ніколи не збігатимуться один з одним, але технічно імена могли б, але малоймовірно, і всі вони повинні бути перераховані в один масив. Я подивився array_merge, але не був впевнений, чи це найкращий спосіб це зробити. Крім того, як би ви перевірили це?


5
Здається, ви, мабуть, просто шукаєте array_merge.
Корбін,

Я думаю, що найкращим способом, якщо ви знаєте, що ключі різні, є використання оператора + =: $ array1 + = $ array2; Це додає всі елементи $ array2 до кінця $ array1.
Девід Спектор,

Відповіді:


127

array_merge() є більш ефективним, але є кілька варіантів:

$array1 = array("id1" => "value1");

$array2 = array("id2" => "value2", "id3" => "value3", "id4" => "value4");

$array3 = array_merge($array1, $array2/*, $arrayN, $arrayN*/);
$array4 = $array1 + $array2;

echo '<pre>';
var_dump($array3);
var_dump($array4);
echo '</pre>';


// Results:
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }

7
Яка перевага array_merge перед використанням оператора?
jsteinmann

37
Союз масивів (+): Оператор + додає елементи решти ключів від праворучного масиву до лівого, тоді як дубльовані ключі НЕ перезаписуються. array_merge (): Якщо вхідні масиви мають однакові ключі рядків, то пізніше значення для цього ключа замінить попереднє. Якщо, однак, масиви містять числові ключі, пізніше значення не перезапише вихідне значення, а буде додане. Якщо всі масиви містять лише числові ключі, отриманий масив отримує збільшувальні клавіші, починаючи з нуля.
Семюель Кук

12
Слід також зазначити, що array_mergeповерне NULL, якщо будь-який з аргументів NULL.
SeanWM 06.03.14

4
Якщо є цілочисельні ключі, то вони будуть змінені на цілочисельні клавіші ПОЧАТКУВАННЯ від 0. Будьте дуже обережні з array_merge. Краще використовуйте цикл foreach, щоб робити те, що ви намагаєтесь зробити.
user2850305

24

Перевірте array_merge().

$array3 = array_merge($array1, $array2);

22
@SudhanshuSaxena Враховуючи, що я була першою людиною, яка її опублікувала, я не бачу, як це може бути повторною відповіддю.
Бред

10

Існує також array_replaceде оригінальний масив змінюється іншими масивами, зберігаючи асоціацію значення key => без створення дублікатів ключів.

  • Ті самі ключі на інших масивах змусять значення перезаписувати вихідний масив
  • Нові ключі на інших масивах будуть створені на вихідному масиві

1
Це правильна відповідь. array_merge не буде працювати, якщо у вас є числові клавіші (усі ключі будуть перетворені в узгоджені індекси).
Дмитро

3

Я використовую обгортку навколо array_merge, щоб мати справу з коментарем SeanWM щодо нульових масивів; Я також іноді хочу позбутися дублікатів. Я також, як правило, хочу об’єднати один масив в інший, на відміну від створення нового масиву. Це закінчується як:

/**
 * Merge two arrays - but if one is blank or not an array, return the other.
 * @param $a array First array, into which the second array will be merged
 * @param $b array Second array, with the data to be merged
 * @param $unique boolean If true, remove duplicate values before returning
 */
function arrayMerge(&$a, $b, $unique = false) {
    if (empty($b)) {
        return;  // No changes to be made to $a
    }
    if (empty($a)) {
        $a = $b;
        return;
    }
    $a = array_merge($a, $b);
    if ($unique) {
        $a = array_unique($a);
    }
}

2
        $array = array(
            22 => true,
            25 => true,
            34 => true,
            35 => true,
        );

        print_r(
            array_replace($array, [
                22 => true,
                42 => true,
            ])
        );

        print_r(
            array_merge($array, [
                22 => true,
                42 => true,
            ])
        );

Якщо це числовий, але не послідовний асоціативний масив, вам потрібно використовувати array_replace


0

Я натрапив на це питання, намагаючись визначити чистий спосіб об’єднати два асоційовані масиви.

Я намагався об’єднати дві різні таблиці, які не мали стосунків між собою.

Це те, що я придумав для запиту PDO, об’єднавши дві таблиці. Семюель Кук вирішив для мене рішення із array_merge()оцінкою +1.

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Residential_Prospects."";
        $ResidentialData = $pdo->prepare($sql);
        $ResidentialData->execute(array($lapi));
        $ResidentialProspects = $ResidentialData->fetchAll(PDO::FETCH_ASSOC);

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Commercial_Prospects."";
        $CommercialData = $pdo->prepare($sql);
        $CommercialData->execute(array($lapi));
        $CommercialProspects = $CommercialData->fetchAll(PDO::FETCH_ASSOC);

        $Prospects = array_merge($ResidentialProspects,$CommercialProspects);
        echo '<pre>';
        var_dump($Prospects);
        echo '</pre>';

Можливо, це допоможе комусь іншому.


0

ОНОВЛЕННЯ Лише коротка примітка, оскільки я бачу, це виглядає по-справжньому дурним, і це не має користі від чистого PHP, оскільки там array_mergeпросто працює. АЛЕ спробуйте це за допомогою драйвера PHP MongoDB, перш ніж поспішати голосувати проти. Цей чувак БУДЕ додавати індекси з будь-якої причини, І ВРУЩАЄ об’єднаний об’єкт. З моєю наївною малою функцією об’єднання виходить саме таким, як це передбачалося, з традиційним array_merge.


Я знаю, що це старе запитання, але я хотів би додати ще один випадок, який нещодавно був із запитами драйверів MongoDB, і жоден із них array_merge, array_replaceа також не array_pushпрацював. У мене була трохи складна структура об'єктів, обгорнутих як масиви в масив:

$a = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]]
];
$t = [
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

І мені потрібно було об’єднати їх, зберігаючи таку саму структуру, як це:

$merged = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]],
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

Найкращим рішенням, яке я придумав, було таке:

public static function glueArrays($arr1, $arr2) {
    // merges TWO (2) arrays without adding indexing. 
    $myArr = $arr1;
    foreach ($arr2 as $arrayItem) {
        $myArr[] = $arrayItem;
    }
    return $myArr;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.