Php 按子值对多维数组和完全关联数组排序

Php 按子值对多维数组和完全关联数组排序,php,arrays,sorting,Php,Arrays,Sorting,我有一个多维数组,父数组和子数组都是关联的。 虽然有各种方法可以通过子值(如或)对具有数字顶层和关联子级的多维数组进行排序,但在顶层也是关联的情况下,我无法这样做 这是我的密码: $dbstructure = array ( 'documents' => array ( 'prettyname' => array ('en' => 'Documents', 'pl' => 'Dokumenty', 'de' => 'Dokum

我有一个多维数组,父数组和子数组都是关联的。
虽然有各种方法可以通过子值(如或)对具有数字顶层和关联子级的多维数组进行排序,但在顶层也是关联的情况下,我无法这样做

这是我的密码:

$dbstructure = array (      

    'documents' => array ( 
        'prettyname' => array ('en' => 'Documents', 'pl' => 'Dokumenty', 'de' => 'Dokumente'), 
        'columns' => array ('file', 'name', 'descr', 'tags' ),  
    ),

    'photos' => array ( 
        'prettyname' => array ('en' => 'Photos', 'pl' => 'Zdjęcia', 'de' => 'Fotos'), 
        'columns' => array ('name', 'file', 'descr', 'publish', 'tags', 'file_date' ),
    ),

    'users' => array ( 
        'prettyname' => array ('en' => 'Users', 'pl' => 'Użytkownicy', 'de' => 'Benutzer'), 
        'columns' => array ('name', 'password', 'email', 'role', 'status', 'lang' ),
    )
);

数组是描述db结构的配置文件的一部分,我想按
..['prettyname'][$lang]
$lang
'en'
'pl'
'de'
对第一级进行排序。换句话说,用户应按照其语言中正确的字母顺序获取表名

英国人得到这个订单:
“文档”
-
“照片”
-
“用户”

Pole获得:
“文档”
-
“用户”
-
“照片”
(Dokumenty-Użytkownicy-Zdjęcia)
德语版本:
“用户”
-
“文档”
-
“照片”
(Benutzer-Dokumente-Fotos)


非常感谢您的帮助。谢谢

uasort仍然可以实现您想要的功能,前提是您有一个支持“使用”的PHP版本,用于将附加值包含到匿名函数(PHP5.3及更高版本)的范围内


感谢@Patrick的快速回复,并为我的迟到道歉。但是,当我尝试使用
$dbstructure
的其他数据时,您的示例是有效的,它的顺序错误,我无法解释原因:(.虽然可能是特殊字符的问题,但它们不是。例如,这些3 db表:
$dbstructure=array('components'=>array('name'=>array('en'=>'Components'、'pl'=>'Składniki'、'de'=>'Komponenten')、'locations'=>数组('prettyname'=>数组('en'=>'locations'、'pl'=>'Siedziby'、'de'=>'Standorte')、'parts'=>数组('en'=>'parts'、'pl'=>'Cz'>'Teile')、'pl'=>)
波兰语排序是Składniki>Części>siedzib在第二个示例中,“prettyname”被称为“name”,专门用于“components”。由于“prettyname”缺失,因此首先排序。可能应该更改结构,使其具有“prettyname”,或者如果需要,排序函数应该使用“name”作为备份“prettyname”已丢失。如果您将其更改为“prettyname”,它将返回预期的排序。您让我开心了!!!愚蠢的错误[rollingeyes]谢谢谢谢!!现在起作用了。
<?php

$dbstructure = array (

    'documents' => array (
        'prettyname' => array ('en' => 'Documents', 'pl' => 'Dokumenty', 'de' => 'Dokumente'),
        'columns' => array ('file', 'name', 'descr', 'tags' ),
    ),

    'photos' => array (
        'prettyname' => array ('en' => 'Photos', 'pl' => 'Zdjęcia', 'de' => 'Fotos'),
        'columns' => array ('name', 'file', 'descr', 'publish', 'tags', 'file_date' ),
    ),

    'users' => array (
        'prettyname' => array ('en' => 'Users', 'pl' => 'Użytkownicy', 'de' => 'Benutzer'),
        'columns' => array ('name', 'password', 'email', 'role', 'status', 'lang' ),
    )
);


function sortDbStructureByLocale($dbStructure, $locale) {
    // here we're passing a custom function to uasort and including locale in it's scope
    // with "use" as per https://stackoverflow.com/a/22610655/2149955
    uasort($dbStructure, function($a, $b) use ($locale) {
        // if both prettynames are defined for this locale, sort based on them
        if(isset($a['prettyname'][$locale]) && isset($b['prettyname'][$locale])) {
            return strcmp($a['prettyname'][$locale], $b['prettyname'][$locale]);
        }
        // sort mising names earlier
        if(!isset($a['prettyname'][$locale])) {
            return -1;
        }
        if(!isset($b['prettyname'][$locale])) {
            return 1;
        }
        return 0;
    });
    return $dbStructure;
}

echo "unsorted: " . json_encode($dbstructure) . "\n\n";

echo "English sorting: " . json_encode(sortDbStructureByLocale($dbstructure, 'en')) . "\n\n";
echo "Polish sorting: " . json_encode(sortDbStructureByLocale($dbstructure, 'pl')) . "\n\n";
echo "German sorting: " . json_encode(sortDbStructureByLocale($dbstructure, 'de')) . "\n\n";