关联数组的合并递归问题

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
            )

    )

【讨论】:

有些功能我不熟悉。在应用解决方案之前,我将首先研究它们。一旦我取得任何进展,我会更新。谢谢。

以上是关于关联数组的合并递归问题的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 将两个数组(相同长度)合并为一个关联?

PHP 将两个关联数组合并为一个数组

递归查找重复文件(bash4,关联数组)

递归查找具有相同名称的文件(bash4,关联数组)

无法从 JDBC 获取 OUT 参数中的二维关联数组

PHP树-不需要递归