关联数组的合并递归问题
Posted
技术标签:
【中文标题】关联数组的合并递归问题【英文标题】:Trouble with merge recursive for associative arrays 【发布时间】:2016-07-26 09:32:34 【问题描述】:我在下面的数组上使用了 array_merge_recursive:
数组([111-23456-789] => 0 [2380600] => 1963 [8123123] => 0...)
数组([111-23456-789] => 0 [2380600] => 3860 [8123123] => 0...)
注意:因为 array_merge_recursive 作用于字符串键,所以上述数组的键实际上是另一个数组的字符串类型值。此外,数组实际上比这更大,因此数组的结束括号之前的“...”。
预期输出(根据我在 W3Schools.com 和 php.net 中的理解):
数组 ( [111-23456-789] => 数组 ( [0] => 0 [1] => 0 ) [2380600] => 数组 ( [0] => 1963 [1] => 3860 ) [ 8123123] => 数组 ( [0] => 0 [1] => 0 )...)
相反,我得到了这样的废话:
数组 ( [111-23456-789] => 数组 ( [0] => 0 [1] => 0 ) [0] => 1963 [1] => 0 [2] => 365... )
以下是我获得键数组的方法:
while ($nrows = mysqli_fetch_assoc($resultSetNames))
$name = $nrows['name'];
array_push($arrayNamesRes, "$name");
这就是我制作第一个关联数组的方式:
$nov = 0;
while ($novrows = mysqli_fetch_assoc($resultSetNov))
$counter = $novrows['count(playsms_tblsmsoutgoing.uid)'];
$arrayNovRes[$arrayNamesRes[$nov]] = $counter;
$nov++;
...和我的第二个关联数组:
$dec = 0;
while ($decrows = mysqli_fetch_assoc($resultSetDec))
$counter = $decrows['count(playsms_tblsmsoutgoing.uid)'];
$arrayDecRes[$arrayNamesRes[$dec]] = $counter;
$dec++;
我可以做些什么来获得预期的输出?我仍然是使用 *** 的新手。如果这篇文章太模糊,请说明。提前谢谢你。
【问题讨论】:
【参考方案1】:问题是,即使您的键表示为字符串,并且仅由数字组成,PHP 仍将它们视为数字键。您可以做的是在键名中添加一个非数字字符,即最后一个空格,这将强制 PHP 将键视为字符串。当然,这有点 hacky。
这是我关于如何做到这一点的建议:
$merged = [];
foreach ($firstArray as $key => $value)
if (array_key_exists($key, $secondArray))
// key exists in second array as well, merge the values
$merged[$key] = [$value, $secondArray[$key]];
else
// not found in second array, just overwrite to the merged array
$merged[$key] = $value;
或者在这个问题的公认答案中可以找到预先设置密钥的小技巧:PHP's array_merge_recursive behaviour on integer keys
【讨论】:
【参考方案2】:这可以通过多种方式完成,请查看以下解决方案:
1) 如果两个数组在同一位置有相同的键,则使用array_map
函数:
$array1 = array ( '111-23456-789' => 0, '2380600' => 1963, '8123123' => 0);
$array2 = array ( '111-23456-789' => 0, '2380600' => 3860, '8123123' => 0);
$new_array = array_map(function($a, $b, $key)
return array($key => array($a, $b));
, $array1, $array2, array_keys($array1));
$new_array = call_user_func_array('array_merge', $new_array);
print_r($new_array);
2) 如果键不在同一位置,请使用传统方式,即 foreach 循环,如下所示:
$new_array = array();
foreach($array1 as $key => $value)
$new_array[$key][] = $value;
if(isset($array2[$key]))
$new_array[$key][] = $array2[$key];
print_r($new_array);
输出:
Array
(
[111-23456-789] => Array
(
[0] => 0
[1] => 0
)
[2380600] => Array
(
[0] => 1963
[1] => 3860
)
[8123123] => Array
(
[0] => 0
[1] => 0
)
)
【讨论】:
有些功能我不熟悉。在应用解决方案之前,我将首先研究它们。一旦我取得任何进展,我会更新。谢谢。以上是关于关联数组的合并递归问题的主要内容,如果未能解决你的问题,请参考以下文章