PHP мультисортировка в поле массива, содержащее подчеркивание
У меня есть такой массив:
$data[] = array('ALT_ID' => '202143_N', 'bmi' => 2.5);
$data[] = array('ALT_ID' => '202144_P', 'bmi' => 1.2);
$data[] = array('ALT_ID' => '202145_N', 'bmi' => 6.6);
$data[] = array('ALT_ID' => '202146_P', 'bmi' => 3.6);
$data[] = array('ALT_ID' => '202147_N', 'bmi' => 7.6);
$data[] = array('ALT_ID' => '202148_P', 'bmi' => 8.6);
Как отсортировать по ALT_ID (от N до P) и bmi (от низкого до высокого), чтобы получить такой массив:
array (
array('ALT_ID' => '202143_N', 'bmi' => 2.5),
array('ALT_ID' => '202145_N', 'bmi' => 6.6),
array('ALT_ID' => '202147_N', 'bmi' => 7.6),
array('ALT_ID' => '202144_P', 'bmi' => 1.2),
array('ALT_ID' => '202146_P', 'bmi' => 3.6),
array('ALT_ID' => '202148_P', 'bmi' => 8.6)
)
Вот что я пробовал, и это не дает вывод в желаемом формате:
Ссылка на демо: https://eval.in/142639
<?php
$data[] = array('ALT_ID' => '202143_N', 'bmi' => 2.5);
$data[] = array('ALT_ID' => '202144_P', 'bmi' => 1.2);
$data[] = array('ALT_ID' => '202145_N', 'bmi' => 6.6);
$data[] = array('ALT_ID' => '202146_P', 'bmi' => 3.6);
$data[] = array('ALT_ID' => '202147_N', 'bmi' => 7.6);
$data[] = array('ALT_ID' => '202148_P', 'bmi' => 8.6);
foreach ($data as $key => $row) {
$volume[$key] = $row['ALT_ID'];
$bmi[$key] = $row['bmi'];
}
array_multisort($volume, SORT_ASC, SORT_STRING, $bmi, SORT_ASC, $data);
print_r($data);
?>
Спасибо.
2 ответа
Решение
Вам необходимо добавить последний символ ALT_ID к вашему ключу сортировки.
<?php
$data[] = array('ALT_ID' => '202143_N', 'bmi' => 2.5);
$data[] = array('ALT_ID' => '202144_P', 'bmi' => 1.2);
$data[] = array('ALT_ID' => '202145_N', 'bmi' => 6.6);
$data[] = array('ALT_ID' => '202146_P', 'bmi' => 3.6);
$data[] = array('ALT_ID' => '202147_N', 'bmi' => 7.6);
$data[] = array('ALT_ID' => '202148_P', 'bmi' => 8.6);
foreach ($data as $key => $row) {
$pieces = explode('_',$row['ALT_ID']);
$id_piece = $pieces[1];
$volume[$key] = $id_piece . $row['ALT_ID'];
$edition[$key] = $row['bmi'];
}
//edit
array_multisort($volume, SORT_ASC, $edition, SORT_DESC, $data);
print_r($data);
?>
С помощью usort()
было бы проще:
$data = array();
$data[] = array('ALT_ID' => '202143_N', 'bmi' => 2.5);
$data[] = array('ALT_ID' => '202144_P', 'bmi' => 1.2);
$data[] = array('ALT_ID' => '202145_N', 'bmi' => 6.6);
$data[] = array('ALT_ID' => '202146_P', 'bmi' => 3.6);
$data[] = array('ALT_ID' => '202147_N', 'bmi' => 7.6);
$data[] = array('ALT_ID' => '202148_P', 'bmi' => 8.6);
usort($data, function($a, $b){
$x = substr(strrchr($a['ALT_ID'], '_'), 1);
$y = substr(strrchr($b['ALT_ID'], '_'), 1);
if($x == $y) return $a['bmi']-$b['bmi'];
return strcmp($x, $y);
});
print_r($data);