1

合計3つのアレイがあります

アレイ1

array1 = Array( 
    [0] => Array(
        [name] => John 
        [city] => San Francisco 
        [state] => CA 
    ) 
    [1] => Array(
        [name] => Smith 
        [city] => Atlanta 
        [state] => GA 
    ) 
    [2] => Array(
        [name] => Peter 
        [city] => New York 
        [state] => NY 
    ) 
    [3] => Array(
        [name] => Mary 
        [city] => San Jose 
        [state] => CA 
    ) 
)

配列2(平均年齢でソート)

array2 = Array(
    [0] => CA 
    [1] => NY 
    [2] => GA
) 

アレイ3(人口に基づいてソート)

array3 = Array(
    [0] => New York 
    [1] => San Francisco 
    [2] => Atlanta 
    [3] => San Jose
)

最初に配列2に基づいて、次に配列3に基づいて配列1を並べ替えるにはどうすればよいですか?次の出力が必要です。

ソートされた配列1

Array
(
    [0] => Array
        (
            [name] => John
            [city] => San Francisco
            [state] => CA
        )

    [1] => Array
        (
            [name] => Mary
            [city] => San Jose
            [state] => CA
        )

    [2] => Array
        (
            [name] => Peter
            [city] => New York
            [state] => NY
        )

    [3] => Array
        (
            [name] => Smith
            [city] => Atlanta
            [state] => GA
        )

)

array_multisortこれを達成するために使用しようとしましたが、機能していません。

array_multisort($array2,$array3,$array1)

どんな助けでも大歓迎です。

4

2 に答える 2

2

$array1並べ替えて$array2$array3必要な結果を生成する1つの方法は次のとおりです。

<?php

$array1 = array(
    array('name' => 'John',  'city' => 'San Francisco', 'state' => 'CA'),
    array('name' => 'Smith', 'city' => 'Atlanta',       'state' => 'GA'),
    array('name' => 'Peter', 'city' => 'New York',      'state' => 'NY'),
    array('name' => 'Mary',  'city' => 'San Jose',      'state' => 'CA'),
);

$array2 = array(
    'CA',
    'NY',
    'GA'
);

$array3 = array(
    'New York',
    'San Francisco',
    'Atlanta',
    'San Jose'
);

usort(
    $array1,
    function ($element1, $element2) use ($array2, $array3) {
        $state_sort_order = array_flip($array2);

        $element1_state_sort_order = $state_sort_order[$element1['state']];
        $element2_state_sort_order = $state_sort_order[$element2['state']];

        $state_sort_result = $element1_state_sort_order - $element2_state_sort_order;

        if ($state_sort_result === 0) {
            $city_sort_order = array_flip($array3);
            $element1_city_sort_order = $city_sort_order[$element1['city']];
            $element2_city_sort_order = $city_sort_order[$element2['city']];

            return $element1_city_sort_order - $element2_city_sort_order;
        } else {
            return $state_sort_result;
        }
    }
);

print_r($array1);

繰り返しになりますが、usortが最も柔軟性のある選択肢のようでした。array_multisortの使い方を理解する方法があるかもしれませんが、あなたが提供したデータからはわかりませんでした。

関数クロージャ、キャプチャ$array2、および$array3外部スコープからの並べ替えを使用します。usortの要素に適用して$array1ソート順を決定するための比較関数を定義します。この関数では$element1、それぞれが比較のためにからプロセス$element2までの要素の値を受け取ります。たとえば、、または。$array1'Smith,Atlanta,GA''Mary,San Jose,CA'

要素ごとに、要素の都市と州の部分を抽出します。とを反転する$array2と、それぞれとで$array3インデックスを作成すると、並べ替え順序のルックアップテーブルになります。$city$state

残りは、州の並べ替え順序が等しい場合は都市の並べ替え順序の差を返すだけです。それ以外の場合は、州の並べ替え順序を返すだけです。

于 2012-12-01T22:44:39.337 に答える
1

usortを使用することをお勧めします。配列1の要素を配列2および3と比較するユーザー定義関数を定義し、そのコールバックをusortで使用してソートを実行できます。

于 2012-12-01T22:05:39.930 に答える