Как отсортировать несколько массивов в PHP - PullRequest
6 голосов
/ 23 апреля 2010

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

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

Ответы [ 7 ]

6 голосов
/ 23 апреля 2010

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

Я изменил массив score, чтобы иметь различные значения.* Вот рабочая демонстрация.

1 голос
/ 23 апреля 2010

Как насчет этого более простого

$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 голосов
/ 23 апреля 2010

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

$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 (), вероятно, подойдет для этого.

0 голосов
/ 23 апреля 2010

Использовать 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 голосов
/ 23 апреля 2010

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

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

$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 голосов
/ 23 апреля 2010

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

$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 голосов
/ 23 апреля 2010

Разве это не работает только для rsort массива оценок?

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