我是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)上使用典型的排序。我真的想避免使用大量混乱的代码来进行合并/排序功能。
答案 0 :(得分: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));
我不知道这些解决方案中哪一个能够更快地达到预期效果。第一个似乎更具可读性。
答案 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"
}
}