Можно ли использовать usort
для сортировки нескольких полей в многомерном массиве? Например, я хочу отсортировать name
алфавиту, а затем из тех записей, которые я хочу отсортировать по age
. Можно ли использовать sort
?
Array ( [0] => Array ( [name] => Jonah [age] => 27 ) [1] => Array ( [name] => Bianca [age] => 32 ) )
Как насчет:
$arr = Array ( 0 => Array ( 'name' => 'Jonah', 'age' => '27', ), 1 => Array ( 'name' => 'Bianca', 'age' => '32', ), 2 => Array ( 'name' => 'Jonah', 'age' => '25', ), 3 => Array ( 'name' => 'Bianca', 'age' => '35', ), ); function comp($a, $b) { if ($a['name'] == $b['name']) { return $a['age'] - $b['age']; } return strcmp($a['name'], $b['name']); } usort($arr, 'comp'); print_r($arr);
вывод:
Array ( [0] => Array ( [name] => Bianca [age] => 32 ) [1] => Array ( [name] => Bianca [age] => 35 ) [2] => Array ( [name] => Jonah [age] => 25 ) [3] => Array ( [name] => Jonah [age] => 27 ) )
usort($arr, function($a, $b) { $name = strcmp($a['name'], $b['name']); if($name === 0) { return $a['age'] - $b['age']; } return $name; });
Как насчет:
<?php function getRandomName() { $possible = "ab"; $possible_len = strlen($possible); $r = ''; for ($i = 0; $i < 4; $i++) { $r .= substr($possible, mt_rand(0, $possible_len-1), 1); } return ucfirst($r); } $a = array(); for ($i = 0; $i < 10; $i++) { $a[] = array('name' => getRandomName(), 'age' => rand(1,10), 'start_order' => $i); } $order = array('name' => 'desc', 'age' => 'asc'); print_r($a); usort($a, function ($a, $b) use ($order) { $t = array(true => -1, false => 1); $r = true; $k = 1; foreach ($order as $key => $value) { $k = ($value === 'asc') ? 1 : -1; $r = ($a[$key] < $b[$key]); if ($a[$key] !== $b[$key]) { return $t[$r] * $k; } } return $t[$r] * $k; }); print_r($a);