Join the Stack Overflow Community
Stack Overflow is a community of 6.7 million programmers, just like you, helping each other.
Join them; it only takes a minute:
Sign up

OK, I already got this question in stackoverflow but sadly it's in javascript - Javascript - sort array based on another array

and I want it in PHP

$data = array(
   "item1"=>"1",
   "item2"=>"3",
   "item3"=>"5",
   "item4"=>"2",
   "item5"=>"4"
);

to match the arrangement of this array:

sortingArr = array("5","4","3","2","1");

and the output I'm looking for:

$data = array(
    "item3"=>"5",
    "item5"=>"4",
    "item2"=>"3",
    "item4"=>"2",
    "item1"=>"1"
 );

Any idea how this can be done? Thanks.

share|improve this question
    
You could asort() both of them. – Albzi Jun 27 '13 at 8:20
    
Use usort(), with a comparison function that compares the positions of the values in $sortingArr. – Barmar Jun 27 '13 at 8:23

Pretty simple ?

$data = array(
   "item1"=>"1",
   "item2"=>"3",
   "item3"=>"5",
   "item4"=>"2",
   "item5"=>"4"
);

$sortingArr = array("5","4","3","2","1");

$result = array(); // result array
foreach($sortingArr as $val){ // loop
    $result[array_search($val, $data)] = $val; // adding values
}
print_r($result); // print results

Output:

Array
(
    [item3] => 5
    [item5] => 4
    [item2] => 3
    [item4] => 2
    [item1] => 1
)
share|improve this answer
2  
I don't think that this is a good memory efficient solution. The usort function is much more easier and faster in that case. But still this is a working solution for small arrays. BR. – Jacek Kowalewski Jul 8 '14 at 7:07
1  
As long as this isn't done in a critical part of the application and the data is rather small it will do its work in an easy to understand way. – flu Aug 5 '15 at 8:31

For a detailed answer, why array_multisort does not match your needs, view this answer, please: PHP array_multisort not sorting my multidimensional array as expected

In short: You want to sort an array based on a predefined order. The Answer is also given over there, but i copied one solution to this answer, too:

Use usort and array_flip, so you be able to turn your indexing array (ValueByPosition) into a PositionByValue Array.

    $data = array(
   "item1"=>"1",
   "item2"=>"3",
   "item3"=>"5",
   "item4"=>"2",
   "item5"=>"4"
);

usort($data, "sortByPredefinedOrder");

function sortByPredefinedOrder($leftItem, $rightItem){
  $order = array("5","4","3","2","1");

  $flipped = array_flip($order);

  $leftPos = $flipped[$leftItem];
  $rightPos = $flipped[$rightItem];
  return $leftPos >= $rightPos;   
}

print_r($data);
// usort: Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1 )
// uasort: Array ( [item3] => 5 [item5] => 4 [item2] => 3 [item4] => 2 [item1] => 1 )

However this would require you to predict all possible items inside the predefined order array, or thread other items in an appropriate way.

If you want to maintain the assoc keys, use uasort instead of usort.

share|improve this answer

Take a look at array_multisort. I'm not completely sure how to use it, as I have never found a practical use for it (I prefer to use usort to clearly define my terms), but it might work for you.

share|improve this answer
1  
I don't think array_multisort() does what he needs. It will sort one array normally, and then reorder the other array correspondingly. – Barmar Jun 27 '13 at 8:23
    
So if the first array is the one that contains the desired order, shouldn't that mean putting the $data array as the second one sort it accordingly...? I dunno, like I said, never used that function! – Niet the Dark Absol Jun 27 '13 at 8:24
    
I haven't used it, either, but the examples on the documentation page don't seem to match what he wants. Look at Example #1. It doesn't keep either input in its original order. – Barmar Jun 27 '13 at 8:27
    
I've used it for sorting tables based off a user input its certainly a wierd function but sometimes useful I can post up an example but its not directly related to your question i'm afraid – Dave Jun 27 '13 at 8:28
    
See my post for an example, how array multisort works. No it wont work. array_multisort will "sort" the array, definining the order and move the other array's entries relatively up or down. Not what needed here. – dognose Jun 27 '13 at 8:44

Look at my following snippet to sort your array based on another array:

$res_arr = array(); 
for ($i = 0; $i < count($sortingArr); $i++) {
     for ($j = 0; $j < count($data); $j++) {
          if($data[$j] == $sortingArr[$i]) {
             $res_arr[] = $data[$j];
             break;
          }
     }
}
// $res_array is your sorted array now
share|improve this answer
<?php 
$data = array(
   "item1"=>"1",
   "item2"=>"3",
   "item3"=>"5",
   "item4"=>"2",
   "item5"=>"4"
);
$result=array_flip($data);

krsort($result);

$result=array_flip($result);

print_r($result);

//use rsort for the index array

$sortingArr = array("5","4","3","2","1");

print_r($sortingArr);
share|improve this answer
    
It does really not make sense to sort the values of $data by values. Since $sortingArr may not be descending values. Also using array_flip and then krsort is just ugly, you could use rsort directly. – HamZa Jun 27 '13 at 8:34
    
$sortingArr also sorted in descending order by using rsort. Both arrays are available in descending order now – Sundar Jun 27 '13 at 8:35

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.