7

データの配列を生成するスクリプトを作成しましたが、スコアの順に表示したいと考えています。配列は次のように出力されます。

[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() を見てきましたが、何も動作しません。どんな助けでも大歓迎です。

4

7 に答える 7

7

これはまさにPHParray_multisortが使用される場所です。そのうちの 1 つのみで発生する比較に基づいて、多くの配列を並べ替えたい場合です。

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


?>

これが動作するデモです。

于 2010-04-23T06:47:20.740 に答える
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);
于 2010-04-23T06:50:08.710 に答える
0

rsortスコア配列だけでは機能しませんか?

rsort($data['score'], SORT_NUMERIC);
于 2010-04-23T06:31:47.247 に答える
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] => 
        )

)
于 2010-04-23T06:40:12.873 に答える
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];
}
于 2010-04-23T06:44:35.773 に答える
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
于 2010-04-23T07:00:14.337 に答える
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() を使用した他の回答は、そのニーズに合う可能性があります。

于 2010-04-23T07:08:40.937 に答える