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中提及这些细节?