PHP объединяет два ассоциативных массива в один массив
$array1 = array("$name1" => "$id1");
$array2 = array("$name2" => "$id2", "$name3" => "$id3");
мне нужен новый массив, объединяющий все вместе, т. е. это будет
$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");
каков наилучший способ сделать это?
Извините, я забыл, идентификаторы никогда не будут совпадать друг с другом, но технически имена могут, но вряд ли, и все они должны быть перечислены в одном массиве. Я посмотрел на array_merge, но не был уверен, что это лучший способ сделать это. Кроме того, как бы вы это проверили?
7 ответов:
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>';
проверить
array_merge().$array3 = array_merge($array1, $array2);
другой вариант:array_replace, где исходный массив изменяется другими массивами:
- те же ключи вызовут последующие значения для переполнения исходного массива
- новые ключи на последующих массивах будут созданы на исходном массиве
Это означает, что ключ => значение ассоциация сохраняется, и никакие дубликаты ключей не вставляются.
Я использую оболочку вокруг 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); } }
я наткнулся на этот вопрос, пытаясь определить чистый способ объединения двух массивов assoc.
Я пытался объединить две разные таблицы, которые не имеют отношения друг к другу.
это то, что я придумал для 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>';может быть, это поможет кому-то еще.
Я знаю, что это старый вопрос, но я хотел бы добавить еще один случай, который я недавно имел с запросами драйвера 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; }
$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
Comments