首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PHP 5.4版本中对多维数组进行排序?

如何在PHP 5.4版本中对多维数组进行排序?
EN

Stack Overflow用户
提问于 2018-08-14 01:25:46
回答 2查看 105关注 0票数 0

我有一个数组结构,它的print_r输出如下所示:

代码语言:javascript
复制
Array
(
    [0] => Array
        (
            [0] => Game
            [1] => Date
            [2] => Site
            [3] => Address
            [4] => FirstName
            [5] => LastName
            [6] => Email
            [7] => Phone
        )

    [1] => Array
        (
            [0] => B-Dry @ Blue Wave DH
            [1] => 7/9/2019 13:00
            [2] => Blue Wave Dover City Park
            [3] => Dover
            [4] => John
            [5] => Doe
            [6] => john.doe@perrylocal.org
            [7] => (555) 555-4797
        )

    [2] => Array
        (
            [0] => B-Dry @ Blue Wave DH
            [1] => 7/9/2019 13:00
            [2] => Blue Wave Dover City Park
            [3] => Dover
            [4] => Frank
            [5] => Sinatra
            [6] => frank@sinatra.com
            [7] => (555) 685-5555
        )

    [3] => Array
        (
            [0] => B-Dry @ Gnaden
            [1] => 6/7/2019 18:00
            [2] => Gnaden Indian Valley HS
            [3] => Gnadenhutten
            [4] => Jimmy
            [5] => Dean
            [6] => jimmy@dean.org
            [7] => (330) 555-5555
        )
   [...many more...]
)

数据来自excel电子表格。如果它来自SQL,排序将是微不足道的。:-)

如何对此数组进行排序/重排序,如下所示:

  1. 忽略第一个数组集合(列标签,而不是数据)
  2. 首先按索引0排序(例如:"B-Dry @ Blue Wave DH“)
  3. 第二次按索引1排序(例如:"7/9/2019 13:00”)
  4. 第三次按索引2排序(例如:"Blue Wave Dover City Park")

This post似乎很有前途,但我相信array_column只能在PHP5.5下工作,我还不能升级到PHP5.5。而且我不确定如何在所有情况下排除第一个数组集合(列标签)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-14 01:44:18

下面是一个函数,它将根据需要的列数对多维数组进行排序:

代码语言:javascript
复制
function mult_usort(&$arr, $max_index = false, $index = 0) {

    // Done on purpose, could not use a closure
    function mult_usort_callback($a, $b, $max_index, $index) {
        $max_index = $max_index ?: (count($a) - 1);

        // Recursive to sort till the max index
        if ($a[$index] == $b[$index]) {
            if ($index < $max_index) {
                return mult_usort_callback($a, $b, $max_index, ($index + 1));
            } else {
                return 0;
            }
        }
        return $a[$index] > $b[$index] ? 1 : -1;
    };

    usort($arr, create_function('$a, $b', 'return mult_usort_callback($a, $b, ' . $max_index . ', ' . $index . ');'));
}

并像这样使用它:

代码语言:javascript
复制
// Remove the 1st item
array_shift($data);

// Change the date & time column to DateTime objects for proper comparison
// DateTime: PHP >= 5.2
$data = array_map(function ($item) {
    $item[1] = DateTime::createFromFormat('d/m/Y H:i', $item[1]);
    return $item;
}, $data);

// Then sort with the function, till index 2
mult_usort($data, 2);

此函数使用:

如果你的数据是一个SQL查询的结果,你最好在你的查询中使用ORDER,这将会更容易并且更快的

另请参阅:

票数 2
EN

Stack Overflow用户

发布于 2018-08-14 02:50:48

要删除第一个元素,只需:

代码语言:javascript
复制
unset($array[0]);

然后使用usort函数和DateTime比较:

代码语言:javascript
复制
    <?php

$data = [
    [
            'Game',
            'Date',
            'Site',
            'Address',
            'FirstName',
            'LastName',
            'Email',
            'Phone'
    ],
    [
            'B-Dry @ Gnaden',
            '6/7/2019 18:00',
            'Gnaden Indian Valley HS',
            'Gnadenhutten',
            'Jimmy',
            'Dean',
            'jimmy@dean.org',
            '(330) 555-5555'
    ],
    [
            'B-Dry @ Blue Wave DH',
            '7/9/2019 19:00',
            'Blue Wave Dover City Park',
            'Dover',
            'John',
            'Doe',
            'john.doe@perrylocal.org',
            '(555) 555-4797'
    ],
    [
            'B-Dry @ Blue Wave DH',
            '7/9/2019 13:00',
            'Blue Wave Dover City Park',
            'Dover',
            'Frank',
            'Sinatra',
            'frank@sinatra.com',
            '(555) 685-5555'
    ]
];

    unset($data[0]);

    usort($data, function ($a, $b) {
       if ($a[0] == $b[0]) {
           $d1 = DateTime::createFromFormat('d/m/y h:i',$a[1]);
           $d2 = DateTime::createFromFormat('d/m/y h:i',$b[1]);
           if ($d1 == $d2) {
                if ($a[2] == $b[2]) {
                    return 0;
                }
                return ($a[2] < $b[2]) ? -1 : 1;
           }
           return ($d1 < $d2) ? -1 : 1;
       }
       return ($a[0] < $b[0]) ? -1 : 1;
    });

    var_dump($data, true);

查看地址:https://3v4l.org/uMacS

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51827622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档