I have an array of arrays:
Array ( [0] => Array ( [id] = 7867867, [title] = 'Some Title'), [1] => Array ( [id] = 3452342, [title] = 'Some Title'), [2] => Array ( [id] = 1231233, [title] = 'Some Title'), [3] => Array ( [id] = 5867867, [title] = 'Some Title') )
The need to go in a specific order:
- 3452342
- 5867867
- 7867867
- 1231233
How would I go about doing that? I have sorted arrays before, and read plenty of other posts about it, but they are always comparison based (i.e. valueA < valueB).
Help is appreciated.
Advertisement
Answer
You can use usort()
to dictate precisely how the array is to be sorted. In this case, the $order
array can be used within the comparison function.
The example below uses a closure
to make life easier.
$order = array(3452342, 5867867, 7867867, 1231233); $array = array( array('id' => 7867867, 'title' => 'Some Title'), array('id' => 3452342, 'title' => 'Some Title'), array('id' => 1231233, 'title' => 'Some Title'), array('id' => 5867867, 'title' => 'Some Title'), ); usort($array, function ($a, $b) use ($order) { $pos_a = array_search($a['id'], $order); $pos_b = array_search($b['id'], $order); return $pos_a - $pos_b; }); var_dump($array);
The key to this working is having the values that are being compared, be the positions of the id
s within the $order
array.
The comparison function works by finding the positions of the ids of two items to be compared within the $order
array. If $a['id']
comes before $b['id']
in the $order
array, then the return value of the function will be negative ($a
is less so “floats” to the top). If $a['id']
comes after $b['id']
then the function returns a positive number ($a
is greater so “sinks” down).
Finally, there is no special reason for using a closure; it’s just my go-to way of writing these sorts of throwaway functions quickly. It could equally use a normal, named function.