PHP-根据值对多维数组子数组进行排序 排列 目标
我想保持一级和二级数组及其值不变。我需要根据PHP-根据值对多维数组子数组进行排序 排列 目标,php,arrays,sorting,multidimensional-array,laravel-5,Php,Arrays,Sorting,Multidimensional Array,Laravel 5,我想保持一级和二级数组及其值不变。我需要根据顺序-字段中的值对第二个子数组中的键进行排序。因此,在标明年份的地方,子数组应按ASC或DESC排序,所有其他键/值/结构/映射应保持原样 排序数组: array ( [0] => array ( [field1] => 'name' [field2] => 'text' [field3] => array ( [0] => array
顺序
-字段中的值对第二个子数组中的键进行排序。因此,在标明年份的地方,子数组应按ASC或DESC排序,所有其他键/值/结构/映射应保持原样
排序数组:
array (
[0] => array
(
[field1] => 'name'
[field2] => 'text'
[field3] => array
(
[0] => array
(
[text] => 'This arrays order is to be kept!'
[name] => 'Only sort the sub-sub-array below!'
[order] => ''
)
)
)
[1] => array
(
[field1] => 'name'
[field2] => 'text'
[field3] => array
(
[0] => array
(
[text] => '2014'
[name] => 'Dummy!'
[order] => '1'
)
[1] => array
(
[text] => '2013'
[name] => 'Try me!'
[order] => '2'
)
[2] => array
(
[text] => '1985'
[name] => 'Help!'
[order] => '5'
)
[3] => array
(
[text] => '2002'
[name] => 'Please!'
[order] => '4'
)
[4] => array
(
[text] => '2007'
[name] => 'Order!'
[order] => '3'
)
)
)
...
帮助
我花了好几个小时尝试不同的定制解决方案,主要是基于usort()
,但我也知道这些问答都没有描述我遇到的情况
我开始怀疑这是否可能。
有人知道是不是?如果是这样的话,你能解释一下或者提供一个提示/教程/示例来演示吗
拉威尔5.1
我从一个Laravel模型中检索这个,并使用toArray()
我很高兴知道在Laravel中是否有更好的方法来实现这一点。如果我正确理解了这个问题,这可能是一个解决方案(在这些示例中,
$arr
是保存数组的变量):
函数cmp($a,$b)
{
退货($a['order']<$b['order'])?-1:1;
}
foreach($arr作为$key=>$subar){
foreach($subarr作为$key2=>$subsubsubarr){
如果(是_数组($subsubarr)){
usort($subsubbarr,“cmp”);
$subarr[$key2]=$SubSubSubArr;
}
}
$arr[$key]=$subar;
}
或
函数cmp($a,$b)
{
退货($a['order']<$b['order'])?-1:1;
}
foreach($arr as和$subar){
foreach($subarr as和$subsubarr){
如果(是_数组($subsubarr)){
usort($subsubbarr,“cmp”);
}
}
}
如果我正确理解了问题,这可能是一个解决方案(在这些示例中,$arr
是保存数组的变量):
函数cmp($a,$b)
{
退货($a['order']<$b['order'])?-1:1;
}
foreach($arr作为$key=>$subar){
foreach($subarr作为$key2=>$subsubsubarr){
如果(是_数组($subsubarr)){
usort($subsubbarr,“cmp”);
$subarr[$key2]=$SubSubSubArr;
}
}
$arr[$key]=$subar;
}
或
函数cmp($a,$b)
{
退货($a['order']<$b['order'])?-1:1;
}
foreach($arr as和$subar){
foreach($subarr as和$subsubarr){
如果(是_数组($subsubarr)){
usort($subsubbarr,“cmp”);
}
}
}
如果要排序的子数组始终由同一个键标识,则可以只排序该键的内容
function cmp($a, $b)
{
return ($a['order'] < $b['order']) ? -1 : 1;
}
foreach($arr as &$subarr){
foreach($subarr as &$subsubarr){
if(is_array($subsubarr)){
usort($subsubarr,"cmp");
}
}
}
foreach($testas&$value){
//对每个值使用(^)引用将对现有值进行排序
//数组,而不是创建排序副本。
usort($value['field3'],函数($a,$b){
//对于usort比较函数,可以使用这样的匿名函数。
如果($a['order']<$b['order'])返回-1;
如果($a['order']=$b['order'])返回0;
//在“订单”关系的情况下,您可能需要添加不同键的比较
返回1;//$a['order']此时必须大于$b['order']
});
}
请注意,中使用的比较函数:
如果第一个参数被认为分别小于、等于或大于第二个参数,则必须返回小于、等于或大于零的整数
使用Laravel可能更好,因为数据库很可能比PHP更快地完成排序,但是我们需要了解更多关于模型设置的信息才能弄清楚这一点,这听起来基本上是一个完全不同的问题。如果您要排序的子数组总是由同一个键标识,您可以只排序该键的内容
function cmp($a, $b)
{
return ($a['order'] < $b['order']) ? -1 : 1;
}
foreach($arr as &$subarr){
foreach($subarr as &$subsubarr){
if(is_array($subsubarr)){
usort($subsubarr,"cmp");
}
}
}
foreach($testas&$value){
//对每个值使用(^)引用将对现有值进行排序
//数组,而不是创建排序副本。
usort($value['field3'],函数($a,$b){
//对于usort比较函数,可以使用这样的匿名函数。
如果($a['order']<$b['order'])返回-1;
如果($a['order']=$b['order'])返回0;
//在“订单”关系的情况下,您可能需要添加不同键的比较
返回1;//$a['order']此时必须大于$b['order']
});
}
请注意,中使用的比较函数:
如果第一个参数被认为分别小于、等于或大于第二个参数,则必须返回小于、等于或大于零的整数
使用Laravel可能会更好,因为数据库很可能比PHP更快地完成排序,但我们需要了解更多关于模型设置的信息才能弄清楚这一点,这听起来基本上是一个完全不同的问题。请发布排序后数组的外观。这样我就可以理解你想要实现的目标。请发布数组排序后的外观。这样我就可以理解你想要实现什么。这似乎是实现我目标的最简单的方法,谢谢。这似乎是实现我目标的最简单的方法,谢谢。
function cmp($a, $b)
{
return ($a['order'] < $b['order']) ? -1 : 1;
}
foreach($arr as &$subarr){
foreach($subarr as &$subsubarr){
if(is_array($subsubarr)){
usort($subsubarr,"cmp");
}
}
}
foreach ($test as &$value) {
// Using a (^) reference to each value will sort the existing
// array instead of creating a sorted copy.
usort($value['field3'], function($a, $b) {
// You can use an anonymous function like this for the usort comparison function.
if ($a['order'] < $b['order']) return -1;
if ($a['order'] == $b['order']) return 0;
// In case of 'order' ties, you may want to add a comparison of a different key
return 1; // $a['order'] must be > $b['order'] at this point
});
}