1

我一共有三个数组

阵列 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 对数组 1 进行排序,然后再根据数组 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产生您想要的结果:

<?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 回答