Nikola
Nikola

Reputation: 15038

Merge two sorted arrays and the resulting array should also be sorted

Let's say you have two arrays of arrays with the same structure but different count of arrays in them:

$arr1 = array(array(1,"b"), array(2,"a"), array(5,"c"));  
$arr2 = array(array(3,"e"));  

Now, the data in the $arr1 and $arr2 is sorted, and now what I would like it to merge these two arrays, so I did this:

$res = array_merge($arr1, $arr2);  

And then I get an output like this:

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

But, I would like to have a sorted $res also like this:

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

I wonder if there's a function in PHP to do this automatically, without me having to write my own function? Or, please advise me on which is the best approach for this if I want to (later on) add sorting by the next parameter so the output would be like this

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

Thank you for all your help.

Upvotes: 4

Views: 8896

Answers (4)

Shaan Ansari
Shaan Ansari

Reputation: 550

You can use below function to merge two sorted arrays without array_merge() or 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); 


?>

Upvotes: 0

mpapec
mpapec

Reputation: 50637

Since php v5.3 you can use anon functions in a more natural manner,

<?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
    )

)

Upvotes: 1

Fieg
Fieg

Reputation: 3156

You can first merge the arrays and then sort the final array.

You are probably looking for a multi-sort function. I usually use this function (I found this functions somewhere on the internet years ago, credits go to the original author):

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

You can use it like this:

array_qsort2($res, 0, "ASC");

Upvotes: 3

Sander Marechal
Sander Marechal

Reputation: 23216

Why not simply call ksort($res) after your array_merge?

Upvotes: 1

Related Questions