Php 合并两个已排序的数组,结果数组也应进行排序
假设有两个数组,它们的结构相同,但数组数不同:Php 合并两个已排序的数组,结果数组也应进行排序,php,arrays,sorting,Php,Arrays,Sorting,假设有两个数组,它们的结构相同,但数组数不同: $arr1 = array(array(1,"b"), array(2,"a"), array(5,"c")); $arr2 = array(array(3,"e")); 现在,$arr1和$arr2中的数据被排序,现在我希望它合并这两个数组,所以我这样做: $res = array_merge($arr1, $arr2); 然后我得到如下输出: 1-b 2-a 5-c 3-e 1-b 2-a 3-e 5-c
$arr1 = array(array(1,"b"), array(2,"a"), array(5,"c"));
$arr2 = array(array(3,"e"));
现在,$arr1和$arr2中的数据被排序,现在我希望它合并这两个数组,所以我这样做:
$res = array_merge($arr1, $arr2);
然后我得到如下输出:
1-b
2-a
5-c
3-e
1-b
2-a
3-e
5-c
但是,我想有一个分类的$res也像这样:
1-b
2-a
5-c
3-e
1-b
2-a
3-e
5-c
我想知道PHP中是否有一个函数可以自动执行此操作,而不必编写自己的函数?或者,如果我想(稍后)按下一个参数添加排序,那么请告诉我哪种方法是最好的方法,以便输出如下
2-a
1-b
5-c
3-e
感谢您的帮助。为什么不在阵列合并后直接打电话?您可以先合并阵列,然后对最终阵列进行排序 您可能正在寻找一个多排序函数。我通常使用此功能(几年前我在互联网上的某个地方发现了此功能,版权归原作者):
由于
PHPV5.3
可以更自然地使用anon函数
<?php
$arr1 = array(array(1,"b"), array(2,"a"), array(5,"c"));
$arr2 = array(array(3,"e"));
$res = array_merge($arr1, $arr2);
usort($res, function($a,$b) {
// php7
// return $a[0] <=> $b[0];
if ($a[0] == $b[0]) return 0;
return $a[0] < $b[0] ? -1 : 1;
});
print_r($res);
您可以使用下面的函数合并两个已排序的数组,而不使用array_merge()或sort()
合并后您需要求助,只需额外一行代码即可调用您的分拣路线。这并不意味着粗鲁,但我知道我必须做什么,只是不知道如何做,这是我首先要问的问题。所以,对不起,你一点也没帮上忙。哇!这真的很棒,正是我想要的。非常感谢你!然而,合并后的排序使这成为一个O(n log n)解决方案,其中正确的合并(如合并排序所使用的)是O(n)。我不知道我是否做错了什么,但我无法让它与ksort()一起工作。我得到与合并后相同的数组。菲格斯的回答正是我所需要的。Thx的答复。这是性能无知的解决方案。当然,对于任何短数组都可以。但是OP所询问的通常是以O(n)时间运行的,其中n是数组长度的总和。这只是因为您不需要在数据预排序时进行排序。正确的合并将是O(NM)。数组_合并+排序将为O(NM日志(NM))
Array
(
[0] => Array
(
[0] => 1
[1] => b
)
[1] => Array
(
[0] => 2
[1] => a
)
[2] => Array
(
[0] => 3
[1] => e
)
[3] => Array
(
[0] => 5
[1] => c
)
)
<?php
$arr1 = [1,2,5,7,10,20,36,70,82,90];
$arr2 = [4,6,10,15,65,85,90,100];
function shortt($array1,$array2){
$array1_count = count($array1);
$array2_count = count($array2);
while ($array1_count || $array2_count)
{
$array1_empty = $array1 == [];
$array2_empty = $array2 == [];
if (!$array1_empty && !$array2_empty)
{
if (current($array1) < current($array2))
{
$array3[] = array_shift($array1);
$array1_count--;
}
else
{
$array3[] = array_shift($array2);
$array2_count--;
}
}
elseif (!$array1_empty)
{
$array3[] = array_shift($array1);
$array1_count--;
}
elseif (!$array2_empty)
{
$array3[] = array_shift($array2);
$array2_count--;
}
}
return $array3;
}
$newarr = shortt($arr1,$arr2);
print_r($newarr);
?>