Php 排序多级数组
我有以下数组:Php 排序多级数组,php,arrays,sorting,multidimensional-array,Php,Arrays,Sorting,Multidimensional Array,我有以下数组: array( array( id: 4, name: car, pid: 0 ), array( id: 5, name: lights, pid: 4 ), array( id: 6, name: fog,
array(
array(
id: 4,
name: car,
pid: 0
),
array(
id: 5,
name: lights,
pid: 4
),
array(
id: 6,
name: fog,
pid: 5
)
),
array(
array(
id: 1,
name: bike,
pid: 0
),
array(
id: 2,
name: wheel,
pid: 1
),
array(
id: 3,
name: tire,
pid: 2
)
),
array(
id: 7,
name: car,
pid: 0
),
array(
id: 8,
name: lights,
pid: 7
),
array(
id: 9,
name: brake,
pid: 8
)
),
array(
id: 10,
name: car,
pid: 0
),
array(
id: 11,
name: engine,
pid: 10
)
),
)
这些多维数组表示汽车的规格。在表中,它看起来像:
| car -> lights -> fog |
| bike -> wheel -> tire |
| car -> lights -> brake |
| car -> engine |
| bike -> wheel -> tire |
| car -> lights -> fog |
| car -> lights -> brake |
| car -> engine |
现在我想对数组进行排序,根据名称对每个级别进行排序。所以首先,在第一列排序,而不是在第二列排序等等
我们的排序数组应该如下所示:
| bike -> wheel -> tire |
| car -> engine |
| car -> lights -> brake |
| car -> lights -> fog |
使用usort
我可以对第一列进行排序:
usort($characteristics, function($a, $b){
return $a[0]['name'] > $b[0]['name'];
});
但这当然只会影响第一列,在本例中,数组如下所示:
| car -> lights -> fog |
| bike -> wheel -> tire |
| car -> lights -> brake |
| car -> engine |
| bike -> wheel -> tire |
| car -> lights -> fog |
| car -> lights -> brake |
| car -> engine |
也可以有不同的长度(比如发动机有2个值,自行车有3个值)。通常长度在1到5之间变化
我宁愿不要使用太多for/foreach循环,因为那样会使我的程序太慢。也很抱歉问了这么长的问题,但是我找不到一个更简短的方式来解释我的问题
我希望有人能给我一个简单的清洁解决方案。我相信这就是你想要的:
$arr =
array(
array(
array(
"id" => 4,
"name" => "car",
"pid" => 0
),
array(
"id" => 5,
"name" => "lights",
"pid" => 4
),
array(
"id" => 6,
"name" => "fog",
"pid" => 5
)
),
array(
array(
"id" => 1,
"name" => "bike",
"pid" => 0
),
array(
"id" => 2,
"name" => "wheel",
"pid" => 1
),
array(
"id" => 3,
"name" => "tire",
"pid" => 2
)
),
array(
array(
"id" => 7,
"name" => "car",
"pid" => 0
),
array(
"id" => 8,
"name" => "lights",
"pid" => 7
),
array(
"id" => 9,
"name" => "brake",
"pid" => 8
)
),
array(
array(
"id" => 10,
"name" => "car",
"pid" => 0
),
array(
"id" => 11,
"name" => "engine",
"pid" => 10
)
)
);
for ($i = 0; $i < count($arr); $i++) {
foreach ($arr[$i] as $a) {
foreach($a as $key => $value) {
if ($key == 'name') {
$newArr[$i][] = $value;
}
}
}
}
usort($newArr, function($a, $b) {
return $a[0] > $b[0];
});
echo "<pre>", print_r($newArr), "</pre>";
$arr=
排列(
排列(
排列(
“id”=>4,
“名称”=>“汽车”,
“pid”=>0
),
排列(
“id”=>5,
“名称”=>“灯光”,
“pid”=>4
),
排列(
“id”=>6,
“name”=>“fog”,
“pid”=>5
)
),
排列(
排列(
“id”=>1,
“名称”=>“自行车”,
“pid”=>0
),
排列(
“id”=>2,
“名称”=>“车轮”,
“pid”=>1
),
排列(
“id”=>3,
“名称”=>“轮胎”,
“pid”=>2
)
),
排列(
排列(
“id”=>7,
“名称”=>“汽车”,
“pid”=>0
),
排列(
“id”=>8,
“名称”=>“灯光”,
“pid”=>7
),
排列(
“id”=>9,
“名称”=>“制动器”,
“pid”=>8
)
),
排列(
排列(
“id”=>10,
“名称”=>“汽车”,
“pid”=>0
),
排列(
“id”=>11,
“名称”=>“引擎”,
“pid”=>10
)
)
);
对于($i=0;$i$value){
如果($key=='name'){
$newArr[$i][]=$value;
}
}
}
}
usort($newArr,函数($a,$b){
返回$a[0]>$b[0];
});
echo“”,打印($newArr),“”;
检查此项我知道该函数,但我无法确定应该传递给它哪些参数来对数组进行排序……如果在用户定义的比较函数中比较的两个元素的名称相同,那么请比较接下来的两个重要属性……等等……不完全如此。。它能很好地对名称进行排序,但我丢失了额外的信息(id、pid等),并且它相互嵌套了3个循环,这可以处理这些示例数据,但不能处理我的数据(大得多)在OP中提及这些细节?