Tell me more ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

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. – BeatAlex Jun 27 at 8:20
Use usort(), with a comparison function that compares the positions of the values in $sortingArr. – Barmar Jun 27 at 8:23

5 Answers

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

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 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! – Kolink Jun 27 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 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 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 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 at 8:34
$sortingArr also sorted in descending order by using rsort. Both arrays are available in descending order now – Sundar Jun 27 at 8:35

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

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.