Monday, May 7, 2012

Sort array using another array


I have an array of products and i want to sort them with another array.




$products = array(
0 => 'Pro 1',
1 => 'Pro 2',
2 => 'Pro 3'
);

$sort = array(1,2,0);

array_multisort($products, $sort);



Array should now be ...




$products = array(
0 => 'Pro 2',
1 => 'Pro 3',
2 => 'Pro 1'
);



I don't seem to be using array_multisort correctly. Ive tried different ways for 2 hours now...


Source: Tips4all

3 comments:

  1. It seems like this is more appropriate than a sort:

    $products = array_map(function($i) use ($products) {
    return $products[$i];
    }, $sort);

    ReplyDelete
  2. array_multisort() will not do what you are trying to achieve with that particular code.

    Here is a function that will:

    function sort_by_other_array ($input, $order) {
    $result = array();
    foreach ($order as $item) {
    $result[] = $input[$item];
    }
    return $result;
    }


    This does not error checking but will do what you want. You may need to add checks to ensure that the keys specified in $order are present in $input.

    ReplyDelete
  3. array_multisort sorts the 2nd array and applies the sorting order to the 1st one. To do your job the sorting array has to be $sort = array(2,0,1); (implies: bring 2nd element to 0, 3rd element to 1 and 1st element to 2).

    You simply can use

    foreach ($sort as $key) {
    $sorted_products[] = $products[$key];
    }

    ReplyDelete