6

Я написал скрипт для создания массива данных, но теперь хочу отображать его в порядке оценки. Массив выводится следующим образом.Как отсортировать несколько массивов в PHP

[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(), но не могу получить что-нибудь на работу. Любая помощь приветствуется.

+1

- это данные из базы данных? Возможно, вы можете отсортировать данные перед их помещением в массив? – Hanseh

+0

Да, это результаты для каталога/поисковой системы, поэтому результаты основаны на наиболее эффективном способе получения соответствующих результатов по запросу –

+0

Это * профессия * с одним * f *, но двумя * s *. – Gumbo

ответ

6

Это именно там, где PHP «s array_multisort приходит в использовании. Это случай, когда вы хотите отсортировать множество массивов на основе сравнения, происходящего только в одном из них.

Я изменил массив 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); 


?> 

Here goes a working demo.

+0

У вас когда-либо было ощущение, что PHP слишком много функций сортировки? Все, что вам нужно сделать, это найти правильный, и все ваши проблемы исчезнут. Я узнал новый сегодня, спасибо. –

+0

@Christian: Согласитесь, есть много функций сортировки. Каждый из них предназначен для решения определенной проблемы. Хорошо, что нам не нужно писать свою собственную функцию сортировки большую часть времени. – codaddict

0

Не работает ли только rsort оценка массива?

rsort($data['score'], SORT_NUMERIC); 
+0

нет, только оценка массив. –

0

Мне удалось это сделать, я был только после более эффективного способа;

$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] => 
     ) 

) 
0

Это не пересортируйте их для вас, но это позволит вам пройти через них в нужном порядке. Вы можете переназначить их, если хотите, но я бы просто использовал это для порядка вывода.

Редактировать: Это не сработает из-за возможности не уникальных значений ключа. Смотрите комментарии ниже, и узнать из моей ошибки

$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]; 
}
+0

У нас была такая же идея! Однако вы столкнулись с проблемой, используя array_flip, потому что баллы не гарантированно уникальны. См. Мой ответ для моего варианта. – erisco

+0

А, я вижу проблему. Спасибо, что выпрямили меня;) –

1

Как об этом простом одном

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

Использование 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 
0

Самое элегантное решение, которое я мог найти, не изменило бы порядок структуры данных, а просто обратилось бы к нему по-другому.

$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(), скорее всего, удовлетворит эту потребность.