【问题标题】:Sorting multidimensional AND entirely associative arrays by sub-value按子值对多维和完全关联数组进行排序
【发布时间】:2019-11-17 01:06:01
【问题描述】:

我有一个多维数组,父数组和子数组都是关联的。
虽然有多种方法可以按子值对具有数字顶级和关联子级的多维数组进行排序(如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' ),
    )
);

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

Brit 得到这个订单:'documents' - 'photos'- 'users'
极点:'documents' - 'users'- 'photos' (Dokumenty - Użytkownicy - Zdjęcia)
德国人得到:'users' - 'documents'- 'photos'(Benutzer - Dokumente - 照片)

非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

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

    【讨论】:

    • 感谢@Patrick 的超级快速回复,并为我迟到的回复感到抱歉。您的示例有效,但是当我使用 $dbstructure 的其他数据尝试它时,它的顺序错误,我不知道为什么:(。认为特殊字符可能是问题所在,但事实并非如此。
    • 例如这 3 个 db 表:$dbstructure = array ( 'components' =&gt; array( 'name' =&gt; array ('en' =&gt; 'Components', 'pl' =&gt; 'Składniki', 'de' =&gt; 'Komponenten'), ), 'locations' =&gt; array ( 'prettyname' =&gt; array ('en' =&gt; 'Locations', 'pl' =&gt; 'Siedziby', 'de' =&gt; 'Standorte'), ), 'parts' =&gt; array ( 'prettyname' =&gt; array ('en' =&gt; 'Parts', 'pl' =&gt; 'Części', 'de' =&gt; 'Teile'), ) ); 波兰排序是 Składniki > Części > Siedziby
    • 在您的第二个示例中,“prettyname”改为专门用于“组件”的“名称”。由于缺少“prettyname”,因此首先对其进行排序。大概应该改变结构,使其具有“prettyname”,或者如果缺少“prettyname”,排序功能应该使用“name”作为备份。如果您将其更改为“prettyname”,它将返回预期的排序。
    • 你成就了我的一天!!!愚蠢的错误[翻白眼] 谢谢谢谢!!现在就像一个魅力。
    猜你喜欢
    • 2017-12-01
    • 2011-12-20
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多