[英]PHP efficient way to combine two associative arrays into one multidimensional associative array
[英]PHP combine two associative arrays into one array
$array1 = array("$name1" => "$id1");
$array2 = array("$name2" => "$id2", "$name3" => "$id3");
我需要一个新的数组组合在一起,即它将是
$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");
做这个的最好方式是什么?
抱歉,我忘记了,ID 永远不会相互匹配,但从技术上讲,名称可以,但不太可能,它们都需要列在一个数组中。 我查看了 array_merge 但不确定这是否是最好的方法。 另外,您将如何对此进行单元测试?
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"
}
查看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);
}
}
$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
我偶然发现了这个问题,试图确定一种连接两个关联数组的干净方法。
我试图加入两个彼此没有关系的不同表。
这就是我为 PDO 查询连接两个表而提出的。 Samuel Cook 为我确定了一个解决方案,他的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>';
也许这会帮助其他人。
更新只是一个简短的说明,因为我可以看到这看起来非常愚蠢,并且它对纯 PHP 没有很好的用处,因为array_merge
只是在那里工作。 但是,在您急于投票之前,请尝试使用 PHP MongoDB 驱动程序。 无论出于何种原因,那个家伙都会添加索引,并且会破坏合并的对象。 使用我天真的小函数,合并完全按照传统array_merge
。
我知道这是一个老问题,但我想再添加一个我最近使用 MongoDB 驱动程序查询遇到的案例,并且array_merge
、 array_replace
和array_push
array_replace
。 我在数组中包装为数组的对象结构有点复杂:
$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;
}
对我来说,这个小片段有效。
我的 arrays 都有类似的结构,只是键有点不同。
例如 JSON 1: {"sketchCount":{"2":{"A":50477}},"raw":{"2":{"A":70477}}}
JSON 2: {"sketchCount":{"2":{"B":50477}},"raw":{"2":{"B":50477}}}
所需的 Output JSON: {"sketchCount":{"2":{"A":70477,"B":50477}},"raw":{"2":{"A":70477,"B":50 }}}
代码
foreach($existingArray as $key => $possibleArray){
if(is_array($possibleArray)){
foreach($possibleArray as $index=> $value){
$combinedArray[$key][$index] = $value;
if(array_key_exists($key,$newArray) && array_key_exists($index,$newArray[$key])){
foreach($newArray[$key][$index] as $newKey=> $associatedValue){
$combinedArray[$key][$index][$newKey] = $associatedValue;
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.