根据另一个数组键顺序对多维数组键进行排序

时间:2014-04-03 14:58:52

标签: php arrays sorting multidimensional-array

晚上很晚才看到这个人。

这是按键顺序正确的数组。

Array
(
    [FirstName] => 'Timmy'
    [LastName] => 'O Toole'
    [Address] => 'Nowhere'
    [Tel] => '12345'
    [Email] => 'nonone@nowhere.com'
)

我希望以下数组中的每条记录与上面的键排序相匹配。

(
    [0] => Array
        (
            [FirstName] => 'Robin'
            [Address] => 'Cave'
            [LastName] => 'Mactimmy'
            [Tel] => '9076'
            [Email] => 'i@o.com'
        )

    [1] => Array
        (
            [Address] => 'uytr'
            [FirstName] => 'Bill'
            [Email] => 'j@k.com'
            [LastName] => 'Gates'
            [Tel] => '7654'
        )

    [2] => Array
        (
            [LastName] => 'Mahoney'
            [Email] => 'y@i.ie'
            [FirstName] => 'Tom'
            [Tel] => '5689'
            [Address] => 'kklll'
        )
)

我已尝试过ksort和usort,但数组排序似乎没有更新。

5 个答案:

答案 0 :(得分:2)

基本数据:

$array = [
    0 => Array
        (
            'FirstName' => 'Robin',
            'Address' => 'Cave',
            'LastName' => 'Mactimmy',
            'Tel' => '9076',
            'Email' => 'i@o.com',
        ),

    1 => Array
        (
            'Address' => 'uytr',
            'FirstName' => 'Bill',
            'Email' => 'j@k.com',
            'LastName' => 'Gates',
            'Tel' => '7654',
        ),

    2 => Array
        (
            'LastName' => 'Mahoney',
            'Email' => 'y@i.ie',
            'FirstName' => 'Tom',
            'Tel' => '5689',
            'Address' => 'kklll',
        )
];

我认为这是一个很好的解决方案:

<?php

$order = [ 'FirstName', 'LastName', 'Address', 'Tel', 'Email'];

$result = [];
foreach ($array as $sortable) {
    $result[] = array_merge(array_flip($order), $sortable);
}

print_r($result);

答案 1 :(得分:2)

您可以将array_maparray_merge结合使用。像这样:

$result = array_map(
    function ($arr) use($sample) { return array_merge($sample, $arr); },
    $array
);

这里我假设$array是对象数组,$sample是具有正确有序键的数组。

答案 2 :(得分:1)

使用自定义密钥分拣机:

function cmp($a, $b) {
    // Custom key sort
}

uksort($array, "cmp");

或使用递归ksort:

ksortRecursive(&$array, $sort_flags = SORT_REGULAR) {
    if (!is_array($array)) return false;
    ksort($array, $sort_flags);
    foreach ($array as &$arr) {
        ksortRecursive($arr, $sort_flags);
    }
    return true;
}

借鉴:https://gist.github.com/cdzombak/601849

答案 3 :(得分:1)

function cmp($a, $b)
{
    $order = array('FirstName' => 0, 'LastName' => 1, 'Address' => 2, 'Tel' => 3, 'Email' => 4);
    if ($a == $b || !isset($order[$a]) || !isset($order[$b])) {
        return 0;
    }
    return ($order[$a] < $order[$b]) ? -1 : 1;
}

uksort($a, "cmp");

答案 4 :(得分:1)

function customArraySort($array, $exampleArray) {
  $returnArray = array();
    foreach($array as $arrIndex => $arrSubArr) {
      $returnArray[$arrIndex] = array();
        foreach($exampleArray as $exArIndex => $value)
          $returnArray[$arrIndex][$exArIndex] = $arrSubArr[$exArIndex];
    }
  return $returnArray;
}