0

([0]=>'',[1]=>''...etc)各要素内で番号順に並べられたデータベースから配列を取得しました。さまざまな連想値 (タイトル、日付、エリアなど) があります。同じ「領域」変数を持つすべての要素が一緒に表示されるように、配列の並べ替えが必要です。したがって、効果的にはまだ([0]=>'',[1]=>''...etc)配列がありますが、最初の 5 つほどは同じ「面積」を持ち、次の多くは同じ「面積」を持ちます。

簡単にするために、「エリア」フィールドには 4 つの可能な値 (北、西、中央、ブライス バレー) があります。

私が望んでいないのは、4つの領域でグループ化された多次元配列です。すべての「好きな」領域をまとめる順序で、1つの長い配列として必要です。

これを可能な限り説明したかどうかはわかりませんが、助けていただければ幸いです。何かを解決する必要がある場合は、返信してください。適切に追加します。

4

2 に答える 2

1

SQL でフィールドを ORDER BY できない場合は、usort でカスタム ソート関数を使用して配列をソートするだけです。とにかく、配列にあるエントリの数によっては、パフォーマンスが大幅に低下することはありません。

usort($posts, function ($a, $b) { return strcmp($a['area'], $b['area']); });

あらかじめ決められた並べ替え順序が必要な場合は、さまざまな領域とその優先度のリストを追加します。

$sortOrder = array(
    'north' => 100,
    'west' => 200,
    'central' => 300,
    'blyth valley' => 400,
);

usort($posts, function ($a, $b) use ($sortOrder) {
    if (isset($sortOrder[$a['area']], $sortOrder[$b['area']]))
    {
        return $b['area'] - $a['area'];
    }

    if (isset($sortOrder[$a['area']]))
    {
        return -1;
    }

    if (isset($sortOrder[$b['area']]))
    {
        return 1;
    }

    return 0;
});

「area」フィールドのすべての可能な値に対して優先度が定義されている場合は、テストを削除できますが、将来的に可能な値を変更する可能性があるため、そのままにしておくことをお勧めします。

于 2012-07-16T12:40:06.920 に答える
1

ここに解決策があります...

$arr = array(
    '0' => array( 'area' => 'west' ),
    '2' => array( 'area' => 'north' ),
    '3' => array( 'area' => 'west' ),
    '4' => array( 'area' => 'central' ),
    '5' => array( 'area' => 'west' ),
    '6' => array( 'area' => 'north' )
);

$new = array();

// Get a list of possible areas
$areas = array();
foreach ($arr as $key => $value) {
    if ( ! in_array( $value['area'] , $areas ) ) {
        array_push( $areas, $value['area'] );
    }
}

// For each area...
foreach ($areas as $key => $area) {
    // Find a area that matches...
    foreach ($arr as $key => $value) {
        if ( $value['area'] == $area ) {
            array_push( $new, $value );
        }
    }
}

また、設定された数の領域しかない場合は、最初のループを削除することもできます。エリア配列に可能なエリアのリストを希望の順序で入力するだけです。

于 2012-07-16T12:41:17.217 に答える