1

わかりました、まず、タイトルが正しいかどうかさえわかりません。もしそうなら、申し訳ありません。

ここに、MongoDB クエリの結果である次のループがあります。

foreach($cursor as $obj) {
   $monster = $obj["type"];
   $strenght = $obj["strenght"];
   $obj["value"] = rand(5, 15);
}

ここで、反復ごとrandに変化することを示すためにそこに入れました。value今、私はこの配列が印刷されたときに、それによって順序付けられ、$obj["value"]昇順か降順かを選択できるようにしたいと考えています。


わかりました、私はこれを試しました

foreach($cursor as $obj) {
   $type = $obj["monster"];
   $strenght = $obj["strenght"];
   $obj["value"] = rand(5, 15);

   $newarr[] = $obj;
}

    usort($newarr, "cmp");
    function cmp($a, $b)
    { return $b['value'] < $a['value']; }

    foreach ($newarr as $obj)
    {
        echo $obj['value'] . $obj['type'] . "<br/>";
    }

予想通り、

 $obj["value"] = rand(5, 15);

実際、すべての反復で失われることはありません。$newarr にはその値が含まれています。問題は、それらがまったくソートされないことです。アイテムは、配列内に配置されたのと同じ順序で出力されます。何か助けはありますか?

ありがとう

4

5 に答える 5

0

foreachは、実際には有用なものを生成しません。そこで、原理を説明するために配列の例を作成しました。

$array = array(
    array(
        'type' => 'type a',
        'strength' => '10',
        'value' => '12',
    ),
    array(
        'type' => 'type b',
        'strength' => '12',
        'value' => '15',
    ),
    array(
        'type' => 'type c',
        'strength' => '11',
        'value' => '6',
    ),
);

ここで、この多次元配列を値で並べ替える必要があるため、降順の場合は、タイプb、タイプa、タイプcのリストが作成されます。

探している関数はarray_multisort()です。ここに、この特定のインスタンスでそれを使用する方法のサンプルがあります。まず、関数がその仕事をするために、そのソーター配列を作成する必要があります。次に、マルチソートを使用するだけで完了です。

$sorter = array();

foreach ($array as $key => $row) {
    $sorter[$key] = $row['value'];
}

array_multisort($sorter, SORT_DESC, $array);

現在、$arrayは仕様に従って再利用されています。SORT_ASCを使用して、並べ替えを逆にします。

追加されたコード:完全を期すために、最初に必要なものを技術的に作成する必要があるforeachコードを次に示します。

$array = array();

foreach($cursor as $obj) {
   $row = array();

   $row['type']  = $obj['type'];
   $row['strength']  = $obj['strenght'];
   $row['value'] = rand(5, 15);

   $array[] = $row;
}

また、あなたは強さのタイプミスを持っています:)

于 2012-04-15T09:54:47.483 に答える
0

まず、$obj["value"] = rand(..)同じ配列変数に異なる値を複数回割り当てることです。ループの終わりまでに、変数には1つの値のみが含まれます。

あなたはおそらくこれをやろうとしていました

$obj["value"][] = rand(5, 15); //This adds a new random item to the array contained in $obj['value'] each time

配列アイテムがある場合は、sort()[昇順]関数rsort()[降順[

$sorted = sort($obj["value"]);
print_r($sorted);
于 2012-04-15T07:25:07.917 に答える
0
function mysort ($arr,$d='asc') { 
        global $dir; 
        $dir = $d; 
        uasort($arr, 'cmp'); 
        return ($arr); 
    } 
    function cmp ($a, $b) {
        global $dir;
        if($a['value'] == $b['value']) return 0;
        else  {
            if(strtolower($dir) == 'asc')
                return ($a['value'] > $b['value']) ? 1 : -1;
            else if(strtolower($dir) == 'disc')
                return ($a['value'] > $b['value']) ? -1 : 1;

        }
    } 
    print_r(mysort($obj, 'disc'));

あなたのアップデートによると

これを試してcmp()

function cmp($a, $b) {
    if($a['value'] == $b['value']) return 0;
    return $a['value'] > $b['value'] ? 1 : -1;
}
于 2012-04-15T07:25:12.180 に答える
0

あなたはこの価値を失います

 $obj["value"] = rand(5, 15); 

各反復で私は推測します。php foreachループについては、次のリンクを確認してください。

PHPFOREACH

ソートには、phpのソート機能を使用できます。

PHP SORT

于 2012-04-15T07:25:19.667 に答える
0

整数値を扱っているので、これを簡単に使用できます。

usort($newarr, "cmp");
function cmp($a, $b) {
    return $b['value'] - $a['value'];
}

キーを降順に並べ替えます。昇順に変更する場合は、$a と $b を入れ替えます。


並べ替え関数は通常、項目が同じ場合は比較関数が値 0 を返し、最初の引数が 2 番目の引数よりも小さい場合は <0 (特定のケースでは小さいことを意味します)、最初の引数が大きい場合は >0 を返すことを期待します。二番目。

整数値の場合、これは単純に $a - $b または $b - $a と書くことができます。

于 2012-04-15T10:09:21.707 に答える