Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP 5.4版中对多维数组排序?_Php - Fatal编程技术网

如何在PHP 5.4版中对多维数组排序?

如何在PHP 5.4版中对多维数组排序?,php,Php,我有一个数组结构,其输出如下所示: Array ( [0] => Array ( [0] => Game [1] => Date [2] => Site [3] => Address [4] => FirstName [5] => LastName [6] =>

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

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,那么排序就很简单了。:-)

如何按如下方式对该数组进行排序/重新排序:

  • 忽略第一个数组集(列标签,而不是数据)
  • 首先按索引0排序(例如:“B-Dry@蓝波DH”)
  • 按索引1排序(例如:“7/9/2019 13:00”)
  • 按指数2排序第三(例如:“蓝波多佛城市公园”)

  • 看起来很有希望,但我相信
    array\u column
    只能在PHP5.5中工作,我还不能升级到PHP5.5。我不确定如何在所有情况下排除第一个数组集(列标签)。

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

    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 . ');'));
    }
    
    此功能使用:


    如果您的数据是SQL查询的结果,您最好在查询中对其进行排序,这样做会更简单、更快
    另请参见:

    这里有一个函数,它将按所需的列数对多维数组进行排序:

    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 . ');'));
    }
    
    此功能使用:


    如果您的数据是SQL查询的结果,您最好在查询中对其进行排序,这样做会更简单、更快
    另请参见:

    要删除第一个元素,只需执行以下操作:

    unset($array[0]);
    
    然后使用usort函数和日期时间比较:

        <?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);
    

    要去掉第一个元素,只需:

    unset($array[0]);
    
    然后使用usort函数和日期时间比较:

        <?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);
    


    该数据是如何创建的?将数组排序为有用结构的最佳方法是在它第一次创建的源位置,如数据库查询。如果这是不可能的,那么您可以循环数组。我不确定一个开箱即用的PHP函数在没有某种循环的情况下是否能做到这一点(1)
    unset($array[0])
    以删除那里的列名。(2) 除了方便之外,
    array\u column()
    没有什么特别之处;您可以轻松地使用
    array\u map()
    或传统的
    foreach(){}
    循环,并获得相同的结果。(3) 查看了解
    array\u multisort()
    (4)最后但并非最不重要的一点是,如果您可以在PHP获取数据之前对其进行正确排序,那么请改为进行排序。这些数据是如何创建的?将数组排序为有用结构的最佳方法是在它第一次创建的源位置,如数据库查询。如果这是不可能的,那么您可以循环数组。我不确定一个开箱即用的PHP函数在没有某种循环的情况下是否能做到这一点(1)
    unset($array[0])
    以删除那里的列名。(2) 除了方便之外,
    array\u column()
    没有什么特别之处;您可以轻松地使用
    array\u map()
    或传统的
    foreach(){}
    循环,并获得相同的结果。(3) 查看了解
    array\u multisort()
    (4)最后但并非最不重要的一点是,如果您可以在PHP获得它之前对它进行正确排序,那么请改为这样做。我不确定这是否正确。父数组不仅仅是
    0
    。如果它们被删除,它如何按索引0、1、2的顺序进行排序。问题是忽略第0个索引。即使有多个子数组(如第0个索引),一个简单的for循环也可以解决这个问题,您只需检查值并取消设置数组索引。2.当我们通过使用usort使用用户定义的排序进行排序时,它会忽略删除的索引。3.您可以在我在答案末尾提供的链接中找到答案。我正在更新答案。早期链接的问题是由于日期格式不正确,并且没有比较日期格式的日期。我不确定这是否正确。父数组不仅仅是
    0
    。如果它们被删除,它如何按索引0、1、2的顺序进行排序。问题是忽略第0个索引。即使有多个子数组(如第0个索引),一个简单的for循环也可以解决这个问题,您只需检查值并取消设置数组索引。2.当我们通过使用usort使用用户定义的排序进行排序时,它会忽略删除的索引。3.您可以在我在答案末尾提供的链接中找到答案。我正在更新答案。早期链接的问题是由于日期格式不正确,并且没有比较日期格式的日期。AymDev,这看起来很有希望,但是我可以从您的匿名函数推断您只对前两列进行排序吗?在排序中不包括第三列?@herrmancoder函数按第三列排序时,查看嵌套的
    if
    s:如果第一列和第二列相等,则按第三列排序(索引
    2
    )。我认为我可以改进这段代码,使其成为一个具有最大索引参数的递归函数,以防需要按多个索引排序,这样可以避免编写太多嵌套条件,并且可以重用。告诉我如果你想让我改进这个,我可以明天编辑我的答案;-)请注意,对于PHP7,使用spaceship操作符使用
    usort
    进行多维数组排序更容易。但无论如何,这样做很有趣:-)@HerrimanCoder你可以再次检查我的答案,我找到了一种方法来实现一个更可重用的函数。谢谢你的回答。AymDev,这看起来很有希望,但是我能从你的匿名函数推断你只对前两列进行排序吗?在排序中不包括第三列?@herrmancoder函数按第三列排序时,查看嵌套的
    if
    s:如果第一列和第二列相等,则按第三列排序(索引
    2
    )。我认为我可以改进这段代码,使其成为一个具有最大索引参数的递归函数,以防需要按多个索引排序,这样可以避免编写太多嵌套条件,并且可以重用。告诉我如果你想让我改进这个,我可以明天编辑我的答案;-)请注意,对于PHP7,多维