1

我是新手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) 操作,一个 la 合并排序,但我在 php 中找不到任何优雅的方法,它有 50 个不同的排序函数。结果应该是:

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

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

4

2 回答 2

3

您可以合并数组,然后按以下方式对结果进行排序b

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

现场演示

如果您仍然想要一个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));

现场演示

我不知道在您的情况下,这些解决方案中的哪一个会更快地达到预期的结果。第一个似乎更具可读性。

于 2013-07-03T23:15:07.487 回答
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"
  }
}
于 2013-07-03T23:16:33.063 回答