按子值对多维AND完全关联数组进行排序

时间:2019-07-07 04:11:13

标签: php arrays sorting

我有一个多维数组,并且父数组和子数组都是关联的。
尽管有多种方法可以按子级值(例如herehere)对具有数字顶层和关联子级的多维数组进行排序,但在顶层的情况下,我却没有这样做也是联想。

这是我的代码:

$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)

任何帮助将不胜感激。谢谢!

1 个答案:

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