【问题标题】:Merge two sorted arrays and the resulting array should also be sorted合并两个排序的数组,结果数组也应该排序
【发布时间】:2011-02-21 09:58:58
【问题描述】:

假设你有两个结构相同但数组数量不同的数组:

$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  

感谢您的所有帮助。

【问题讨论】:

  • 你需要在合并后使用,只需要多一行代码就可以调用你的排序例程
  • 我不想粗鲁,但我知道我必须做什么,只是不知道怎么做,这首先是我的问题。所以,很抱歉,但你根本没有帮助。

标签: php arrays sorting


【解决方案1】:

您可以先合并数组,然后对最终数组进行排序。

您可能正在寻找多重排序功能。我通常使用这个功能(几年前我在互联网的某个地方找到了这个功能,致谢原作者):

/*
 * 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");

【讨论】:

  • 哇!这真的很棒,正是我想要的。非常感谢!
  • 但是合并后的排序使得这是一个 O(n log n) 解决方案,其中正确的合并(如合并排序所使用的)是 O(n)。
【解决方案2】:

为什么不在你的array_merge 之后简单地调用ksort($res)

【讨论】:

  • 不知道我是不是做错了什么,但我无法让它与 ksort() 一起工作。我得到与合并后相同的数组。 fiegs 的答案正是我所需要的。谢谢回复。
  • 这是性能无知的解决方案。当然,对于任何短数组都可以。但是 OP 所问的通常是用 O(n) 时间运行,其中 n 是数组长度的总和。
  • 只是因为您不需要排序,因为数据是预先排序的。正确的合并将是 O(NM)。 array_merge + 排序将是 O(NM log(NM))
【解决方案3】:

由于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
    )

)

【讨论】:

    【解决方案4】:

    您可以使用下面的函数来合并两个排序的数组,而不需要 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); 
    
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2019-09-09
      • 1970-01-01
      • 2011-08-22
      相关资源
      最近更新 更多