合并这些数组

时间:2014-04-06 00:05:18

标签: php arrays

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

像这样:

数组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()并没有给我想要的结果。我知道有很多关于合并数组的主题,但我找不到任何与我做同样事情的主题。

3 个答案:

答案 0 :(得分:2)

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';
}

答案 1 :(得分:1)

试试这个,但它没有为索引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;
       }
    }

答案 2 :(得分:1)

好的,我认为这是门票! 此函数将组合传入其中的所有数组,以便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);