关联数组的合并递归麻烦

时间:2016-04-06 06:39:30

标签: php arrays mysqli

我在下面的数组中使用了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++;
}

我可以做些什么来获得预期的输出?我仍然是使用stackoverflow的新手。如果这篇文章太模糊,请说明。提前谢谢。

2 个答案:

答案 0 :(得分:0)

这可以通过多种方式完成,请看下面的解决方案:

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
            )

    )

答案 1 :(得分:0)

问题是,即使您的密钥表示为字符串,并且仅由数字组成,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