合并在Php中排列两个阵列?

时间:2013-07-03 23:03:04

标签: php sorting

我是PHP的新手,所以也许我错过了一些简单的事情。我有两个形式的多维哈希:

Array1:
'x' => Array ( 'a' => num1, 'b' => '1' ), 
'y' => Array ( 'a' => num3, 'b' => '3' ), 
'z' => Array ( 'a' => num5, 'b' => '5' ) 

Array2:
'w' => Array ( 'a' => num1, 'b' => '2' ), 
'q' => Array ( 'a' => num3, 'b' => '4' ), 
'r' => Array ( 'a' => num5, 'b' => '6' ) 

两个数组都按b排序。我想要做的就是将它们合并在一起以获得按b排序的键列表。这应该是一个简单的O(n)操作和合并排序,但我找不到任何优雅的方式在PHP中使用它的50种不同的排序函数。结果应该是:

array('x','w','y','q','z','r')

如果它是一个更短的解决方案,我可以在O(nlogn)上使用典型的排序。我真的想避免使用大量混乱的代码来进行合并/排序功能。

2 个答案:

答案 0 :(得分:3)

您可以将数组合并,然后按b对结果进行排序:

$union = $arr1 + $arr2;
uasort($union, function($a, $b){
    return $a['b'] - $b['b'];
});
$result = array_keys($union);

Live Demo

如果您仍然想要一个O(n)解决方案,那么应该这样做并且它不会过于复杂,但请注意,除非您处理非常大的数组,否则它可能会更慢:

$result = array(); 
$keys = array_keys($arr2);
$i = 0;
foreach($arr1 as $key => $value){
    while($arr2[$keys[$i]]['b'] < $value['b'])
        $result[] = $keys[$i++];
    $result[] = $key;
}
$result = array_merge($result, array_slice($keys, $i));

Live Demo

我不知道这些解决方案中哪一个能够更快地达到预期效果。第一个似乎更具可读性。

答案 1 :(得分:0)

修改

注意到你想要一个不同的结果。我误解了并且认为你想要合并数组但是按顺序保留b键。哎呀!我将此留作参考。


一个简单明了的方法:

$array1 = array(
    'x' => array ( 'a' => 1, 'b' => '1' ),
    'y' => array ( 'a' => 3, 'b' => '3' ),
    'z' => array ( 'a' => 5, 'b' => '5' )
);

$array2 = array(
    'w' => array ( 'a' => 1, 'b' => '2' ),
    'q' => array ( 'a' => 3, 'b' => '4' ),
    'r' => array ( 'a' => 5, 'b' => '6' ) 
);

$merged = array_merge_recursive($array1, $array2);

收率:

array(6) {
  ["x"]=>
  array(2) {
    ["a"]=>
    int(1)
    ["b"]=>
    string(1) "1"
  }
  ["w"]=>
  array(2) {
    ["a"]=>
    int(1)
    ["b"]=>
    string(1) "2"
  }
  ["y"]=>
  array(2) {
    ["a"]=>
    int(3)
    ["b"]=>
    string(1) "3"
  }
  ["q"]=>
  array(2) {
    ["a"]=>
    int(3)
    ["b"]=>
    string(1) "4"
  }
  ["z"]=>
  array(2) {
    ["a"]=>
    int(5)
    ["b"]=>
    string(1) "5"
  }
  ["r"]=>
  array(2) {
    ["a"]=>
    int(5)
    ["b"]=>
    string(1) "6"
  }
}