基于另外两个数组对数组进行排序

时间:2012-12-01 21:59:13

标签: php arrays array-multisort

我总共有三个数组

数组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

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)

非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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分别对其进行索引时,它们会成为排序顺序的查找表。

如果状态排序顺序相等,其余的只是返回城市排序顺序之间的差异,否则只返回状态排序顺序。

答案 1 :(得分:1)

您需要使用usort。您可以定义一个用户定义的函数,用于将数组1的元素与数组2和3进行比较,并在usort中使用该回调来执行排序。