PHP объединяет два ассоциативных массива в один массив

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

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

Мне нужен новый массив, объединяющий все вместе, т.е.

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

Как лучше всего это сделать?

Извините, я забыл, идентификаторы никогда не будут соответствовать друг другу, но технически имена могут, но маловероятно, и все они должны быть перечислены в одном массиве. Я посмотрел на array_merge, но не был уверен, что это лучший способ сделать это. Кроме того, как бы вы это протестировали?

jsteinmann
источник
5
Похоже, вы просто ищете array_merge.
Corbin
Я думаю, что лучший способ, если вы знаете, что все ключи разные, - это использовать оператор + =: $ array1 + = $ array2; Это добавляет все элементы $ array2 в конец $ array1.
Дэвид Спектор

Ответы:

130

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 01
38
Объединение массивов (+): оператор + добавляет элементы оставшихся ключей из правого массива к левому, в то время как дублированные ключи НЕ перезаписываются. array_merge (): если входные массивы имеют одинаковые строковые ключи, то более позднее значение для этого ключа перезапишет предыдущее. Однако, если массивы содержат числовые ключи, более позднее значение не будет перезаписывать исходное значение, а будет добавлено. Если все массивы содержат только числовые ключи, результирующий массив получает увеличивающие ключи, начиная с нуля.
Samuel Cook
13
Также следует отметить, что array_mergeвернет NULL, если какой-либо из аргументов равен NULL.
SeanWM
4
Если есть целочисленные ключи, то они будут заменены на целочисленные, НАЧИНАЯ с 0. Будьте очень осторожны с array_merge. Лучше использовать цикл foreach, чтобы делать то, что вы пытаетесь сделать.
user2850305
24

Проверить array_merge().

$array3 = array_merge($array1, $array2);
Брэд
источник
22
@SudhanshuSaxena Учитывая, что я был первым, кто опубликовал это, я не понимаю, как это может быть повторный ответ.
Брэд,
10

Также существует ситуация array_replace, когда исходный массив модифицируется другими массивами, сохраняя связь ключ => значение без создания дублирующих ключей.

  • Те же ключи в других массивах приведут к перезаписи значений исходного массива
  • Новые ключи в других массивах будут созданы в исходном массиве
Wranvaud
источник
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);
    }
}
xgretsch
источник
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

tom10271
источник
0

Я наткнулся на этот вопрос, пытаясь определить чистый способ соединения двух массивов ассоциаций.

Я пытался соединить две разные таблицы, которые не были связаны друг с другом.

Это то, что я придумал для PDO Query, соединяющего две таблицы. Сэмюэл Кук нашел для меня решение с 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>';

Может быть, это поможет кому-то другому.

Lzoesch
источник
0

ОБНОВЛЕНИЕ Просто небольшое примечание, поскольку я вижу, что это выглядит действительно глупо и бесполезно с чистым PHP, потому что там array_mergeпросто работает. НО попробуйте это с драйвером PHP MongoDB, прежде чем бросаться в голосование против. Этот чувак БУДЕТ добавлять индексы по какой-либо причине и БУДЕТ разрушать объединенный объект. С моей наивной маленькой функцией слияние получается именно так, как и предполагалось с традиционным array_merge.


Я знаю, что это старый вопрос, но я хотел бы добавить еще один случай, который у меня был недавно с запросами драйвера MongoDB, и ни один из них array_mergeи array_replaceне array_pushработал. У меня была немного сложная структура объектов, завернутых в массивы в array:

$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;
}
JohnPan
источник