PHP объединяет два ассоциативных массива в один массив
$array1 = array("$name1" => "$id1");
$array2 = array("$name2" => "$id2", "$name3" => "$id3");
Мне нужен новый массив, объединяющий все вместе, т.е. он будет
$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");
Каков наилучший способ сделать это?
Извините, я забыл, что идентификаторы никогда не будут совпадать друг с другом, но технически имена могли бы, но это было бы маловероятно, и все они должны быть перечислены в одном массиве. Я посмотрел на array_merge, но не был уверен, что это лучший способ сделать это. Также, как бы вы unit test это?
Ответы
Ответ 1
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"
}
Ответ 2
Отъезд array_merge()
.
$array3 = array_merge($array1, $array2);
Ответ 3
Существует также array_replace
, где исходный массив модифицируется другими массивами, сохраняя связь ключ => значение без создания дубликатов ключей.
- Такие же ключи в других массивах приведут к тому, что значения перезапишут исходный массив
- Новые ключи в других массивах будут созданы в исходном массиве
Ответ 4
Я использую оболочку вокруг 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);
}
}
Ответ 5
$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
Ответ 6
Я наткнулся на этот вопрос, пытаясь определить чистый способ объединения двух массивов-помощников.
Я пытался присоединиться к двум различным таблицам, у которых не было отношений друг с другом.
Это то, что я придумал для запроса 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>';
Возможно, это поможет кому-то другому.
Ответ 7
ОБНОВЛЕНИЕ Просто небольшая заметка, поскольку я вижу, что это выглядит действительно глупо и бесполезно для чистого 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;
}