合并两个已排序的数组,并且还应对结果数组进行排序

时间:2011-02-21 09:58:59

标签: 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  

但是,我想有一个排序的$ res也是这样的:

1-b  
2-a
3-e  
5-c  

我想知道PHP中是否有一个函数可以自动执行此操作,而不必编写自己的函数?或者,如果我想(稍后)通过下一个参数添加排序,请告诉我哪种方法是最好的方法,所以输出将是这样的

2-a  
1-b
5-c  
3-e  

感谢您的帮助。

4 个答案:

答案 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); 


?>