如何在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,那么排序就很简单了。:-)
如何按如下方式对该数组进行排序/重新排序:
看起来很有希望,但我相信
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,多维