Объединить два отсортированных массива и результирующий массив также должен быть отсортирован - PullRequest
4 голосов
/ 21 февраля 2011

Допустим, у вас есть два массива массивов с одинаковой структурой, но разным количеством массивов в них:

$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 ]

3 голосов
/ 21 февраля 2011

Вы можете сначала объединить массивы, а затем отсортировать окончательный массив.

Вы, вероятно, ищете функцию мультисортировки.Я обычно использую эту функцию (я нашел эту функцию где-то в Интернете несколько лет назад, кредиты переходят к первоначальному автору):

/*
 * 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 голос
/ 23 мая 2015

Поскольку php v5.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);

output

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
    )

)
1 голос
/ 21 февраля 2011

Почему бы просто не вызвать ksort($res) после вашего array_merge?

0 голосов
/ 15 октября 2018

Вы можете использовать функцию ниже, чтобы объединить два отсортированных массива без 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); 


?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...