【问题标题】:Merging these arrays合并这些数组
【发布时间】:2014-04-06 00:05:18
【问题描述】:

我需要合并这 3 个数组,以便输出是一个二维数组,其中包含来自其他数组的所有值。

像这样:

数组 1:

$winners = array(
    [1] => '20',
    [5] => '2'
);

数组 2:

$losers = array(
    [1] => '5',
    [2] => '1',
);

数组 3

$equal = array(
    [1] => '1',
    [2] => '2',
);

结果:

$result = array(
    [1] => array(
           [0] => '20', //First array
           [1] => '5',  //Second array
           [2] => '1'   //Third array
           ),
    [2] => array(
           [0] => '0',  //First array (Its not in the first array, so result 0)
           [1] => '1',
           [2] => '2'
           ),
    [5] => array(
           [0] => '2',
           [1] => '0',
           [2] => '0'
           ),
);
  • 我不知道数组中有哪些键(它们可能一直不同)
  • 并非所有数组都包含完全相同的键,如果未找到,则应在结果数组中输入 0。

我在互联网上进行了一些搜索,但使用 array_merge_recursive() 和 array_merge() 并没有给我想要的结果。我知道有很多关于合并数组的主题,但我找不到任何主题与我做同样的事情。

【问题讨论】:

  • 您应该为此创建自己的函数。我们无法预测您会像那样随机合并内容。

标签: php arrays


【解决方案1】:

array_merge_recursive() 在此处无法满足您的目的,因为如果其他数组中不存在,它不会用 0 填充。

试试这样的:

$result = array();

// Get all distinct keys from all arrays.
// This is needed to make sure the 0 fill works.
$distinct_keys = array_unique(array_merge(
  array_keys($array1),
  array_keys($array2),
  array_keys($array3)
));

// Loop through each distinct key.
// If the index exists in each array, add it, otherwise, add '0'
foreach ($distinct_keys as $key) {
  $result[$key] = array();
  $result[$key][] = isset($array1[$key]) ? $array1[$key] : '0';
  $result[$key][] = isset($array2[$key]) ? $array2[$key] : '0';
  $result[$key][] = isset($array3[$key]) ? $array3[$key] : '0';
}

【讨论】:

    【解决方案2】:

    试试这个,但它不会像在索引 5 中那样为未定义的索引添加零,你可以这样做而不是为默认值浪费内存。可以边写边用:

    if(!isset($all[5][1])) echo '0';
    

    代码如下:

    $all = array($winners, $losers, $equals);
    $output = array();
       foreach($all as $subArray){
           foreach($subArray as $key => $value){
                 $output[$key][] = $value;
           }
        }
    

    【讨论】:

    • 第一行有问题。当我将它添加到我的代码中时,它不会运行。我也不太明白第一行应该做什么。你能解释一下吗?
    • @DennyBeulen 我的错误,我将 java 语法与 php 语法混合在一起
    • Jep 成功了。但是,我仍然无法使用它。因为当数组中的一个不在结果中时。我看不到哪一个不见了。
    【解决方案3】:

    好的,我想这是票! 此函数将合并所有传递给它的数组,以便 args 中的每个键的结果中都有一个键,并且该键的值是一个具有 n 个值的数组,其中 n 是传入数组的数量。如果给定数组的键存在于相应的传入数组中(即 args 中与结果子数组中的索引相同的数组),则使用该值,否则为零。

    这有助于我将传入数组中的键视为“玩家 ID”,但该名称可能被认为是任意的。

    function combine_scores() {
      $result = array();
      $player_ids = array();
      $num_arrays = func_num_args();
      // get list of all 'players'
      foreach(func_get_args() as $input_array) {
        foreach($input_array as $key=>$val) {
          $player_ids[$key] = true; // memory optimization compared to $player_ids[] = $key;
        }
      }
      // setup the final array
      foreach(array_keys($player_ids) as $player_id) {
        foreach(func_get_args() as $input_array) {
          $result[$player_id][] = array_key_exists($key, $input_array) ? $input_array[$player_id] : 0;
        }
      }
      return $result;
    }
    

    使用它看起来像这样:

    $winners = array('5'=>1);
    $losers = array('2'=>3);
    $result = combine_scores($winners, $losers);
    

    【讨论】:

    • 这确实是一个不错的方法。特别是因为如果传入更多数组,它会自行调整。但是(以及为什么),这种方式或 Aiias 的工作方式会更快吗?
    • 我认为它们的性能相似,但这种技术将扩展到任意数量的输入数组。当有许多输入数组时,会出现一个性能差异:公认的技术将(暂时)使用更多内存,因为它可以找到唯一键(因为它会在内存中重新创建所有数组并在找到唯一键之前将它们相互添加)键)。当数组大小适中时,这将是微不足道的。
    猜你喜欢
    • 2012-06-25
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多