我有一个多维数组,并且父数组和子数组都是关联的。
尽管有多种方法可以按子级值(例如here或here)对具有数字顶层和关联子级的多维数组进行排序,但在顶层的情况下,我却没有这样做也是联想。
这是我的代码:
$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'
。换句话说,用户应以其语言按正确的字母顺序获得表名称。
英国人得到以下命令:'documents'
-'photos'
-'users'
极点得到:'documents'
-'users'
-'photos'
(Dokumenty-Użytkownicy-Zdjęcia)
德语获得:'users'
-'documents'
-'photos'
(Benutzer-Dokumente-Fotos)
任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
uasort仍然可以完成您想要的事情,前提是您拥有一个支持“使用”的PHP版本,用于将其他值包含在匿名函数的范围内(PHP 5.3及更高版本)。
<?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";