假设您有两个阵列阵列,它们具有相同的结构,但阵列中的阵列数量不同:
$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
但是,我想有一个排序的$ res也是这样的:
1-b
2-a
3-e
5-c
我想知道PHP中是否有一个函数可以自动执行此操作,而不必编写自己的函数?或者,如果我想(稍后)通过下一个参数添加排序,请告诉我哪种方法是最好的方法,所以输出将是这样的
2-a
1-b
5-c
3-e
感谢您的帮助。
答案 0 :(得分:3)
您可以先合并数组,然后对最终数组进行排序。
您可能正在寻找多重排序功能。我通常使用这个功能(我在互联网上的某个地方找到了这个功能多年前,归功于原作者):
/*
* sort a multi demensional array on a column
*
* @param array $array array with hash array
* @param mixed $column key that you want to sort on
* @param enum $order asc or desc
*/
function array_qsort2 (&$array, $column=0, $order="ASC") {
$oper = ($order == "ASC")?">":"<";
if(!is_array($array)) return;
usort($array, create_function('$a,$b',"return (\$a['$column'] $oper \$b['$column']);"));
reset($array);
}
你可以像这样使用它:
array_qsort2($res, 0, "ASC");
答案 1 :(得分:1)
为什么不在array_merge之后简单地调用ksort($res)
?
答案 2 :(得分:1)
由于php v5.3
您可以更自然地使用匿名函数,
<?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
(
[0] => Array
(
[0] => 1
[1] => b
)
[1] => Array
(
[0] => 2
[1] => a
)
[2] => Array
(
[0] => 3
[1] => e
)
[3] => Array
(
[0] => 5
[1] => c
)
)
答案 3 :(得分:0)
您可以使用以下函数合并两个已排序的数组,而无需使用array_merge()或sort()。
<?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);
?>