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";