【问题标题】: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++;
}

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

【问题讨论】:

    标签: php arrays mysqli


    【解决方案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
                  )
      
          )
      

      【讨论】:

      • 有些功能我不熟悉。在应用解决方案之前,我将首先研究它们。一旦我取得任何进展,我会更新。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多