я написал сценарий для создания массива данных, но теперь хочу отобразить в порядке оценки. Массив выводится следующим образом.
[display_name] => Array ( [0] => ACT_Web_Designs [1] => user1_design [2] => user2_design ) [proffesion] => Array ( [0] => Web Developer [1] => web developer [2] => Web Developer ) [score] => Array ( [0] => 15 [1] => 6 [2] => 15 ) [img] => Array ( [0] => ./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic [1] => [2] => )
поэтому в двух словах я хочу, чтобы он был преобразован следующим образом;
[display_name] => Array ( [0] => ACT_Web_Designs [1] => user2_design [2] => user1_design ) [proffesion] => Array ( [0] => Web Developer [1] => web developer [2] => Web Developer ) [score] => Array ( [0] => 15 [1] => 15 [2] => 6 ) [img] => Array ( [0] => ./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic [1] => [2] => )
Я смотрю на asort (), но не могу получить что-нибудь для работы. Любая помощь приветствуется.
Это именно то, где используется массив array_multisort PHP
. Это случай, когда вы хотите отсортировать множество массивов на основе сравнения, происходящего только в одном из них.
Я изменил score
массива, чтобы иметь разные значения.
<?php $arr = array( 'display_name' => array('ACT_Web_Designs','user1_design','user2_design'), 'proffesion' => array('Web Developer','web developer','web developer'), 'score' => array(12,6,15), 'img' => array('./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic','','') ); var_dump($arr); array_multisort($arr['score'], SORT_ASC, SORT_NUMERIC, $arr['display_name'], $arr['proffesion'], $arr['img'] ); var_dump($arr); ?>
Здесь идет рабочая демонстрация.
Как насчет этого более простого
$arr = array("k"=>array("A","B","C"),"l"=>array(15,6,15),"n"=>array("k","l","n")); array_multisort($arr["k"],SORT_NUMERIC,SORT_DESC,$arr["l"],$arr["n"]); var_dump($arr);
Разве это не работает, чтобы просто rsort
массив баллов?
rsort($data['score'], SORT_NUMERIC);
Мне удалось это сделать, я был только после более эффективного способа;
$array = array( 'display_name' => array(0 => 'ACT_Web_Designs', 1 => 'user1_design', 2 => 'user2_design' ), 'proffesion' => array( 0 => 'Web Developer', 1 => 'web developer', 2 => 'Web Developer' ), 'score' => array( 0 => 15, 1 => 6, 2 => 15 ), 'img' => array( 0 => './?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic', 1 => '', 2 => '' ) ); arsort($array['score'], SORT_NUMERIC ); foreach($array['score'] as $key => $val ) { $newarray['display_name'][] = $array['display_name'][$key]; $newarray['proffesion'][] = $array['proffesion'][$key]; $newarray['score'][] = $array['score'][$key]; $newarray['img'][] = $array['img'][$key]; } print_r($newarray);
возвращается
Array ( [display_name] => Array ( [0] => ACT_Web_Designs [1] => user2_design [2] => user1_design ) [proffesion] => Array ( [0] => Web Developer [1] => Web Developer [2] => web developer ) [score] => Array ( [0] => 15 [1] => 15 [2] => 6 ) [img] => Array ( [0] => ./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic [1] => [2] => ) )
Использовать rsort ()
<?php $fruits = array("lemon", "orange", "banana", "apple"); rsort($fruits); reset($fruits); while (list($key, $val) = each($fruits)) { echo "$key = $val\n"; } ?>
В этом примере будет отображаться:
0 = orange 1 = lemon 2 = banana 3 = apple
Самое элегантное решение, которое я мог найти, не изменило бы порядок структуры данных, а просто обратилось бы к нему по-другому.
$scores = $data['score']; arsort($scores); $keys_ordered_by_score = array_keys($scores);
Теперь вы можете, скажем, захватить имя display_name и «proffesion», у которого самый высокий балл:
$first_place = $keys_ordered_by_score[0]; echo $data['display_name'][$first_place], ' is a ', $data['proffesion'][$first_place];
Конечно, если вам действительно нужно изменить порядок структуры данных, эта идея бесполезна для вас. Любой другой ответ, использующий array_multisort (), скорее всего, удовлетворит эту потребность.
Это не будет сортировать их для вас, но это позволит вам пройти через них в том порядке, в котором вы хотите. Вы можете переназначить их, если хотите, но я бы просто использовал это для порядка вывода.
Изменить: это не сработает из-за возможности не-уникальных значений ключа. См. Комментарии ниже и узнайте из моей ошибки
$sort_order = $array['score']; arsort($sort_order); $sort_order = array_flip($sort_order); foreach($sort_order as $key){ echo $array['display_name'][$key].' - '.$array['score'][$key]; }