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);

DEMO

Другие вопросы по тегам