Сортировка многомерных и полностью ассоциативных массивов по значению - PullRequest
1 голос
/ 07 июля 2019

У меня есть многомерный массив, и родительский массив, и дочерние массивы являются ассоциативными.
Хотя существуют различные способы сортировки многомерных массивов с числовым верхним уровнем и ассоциативными дочерними уровнями по дочернему значению (например, здесь или здесь ), в моем случае я потерял работу где верхний уровень тоже ассоциативный.

Вот мой код:

$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'. Другими словами, пользователи должны получать имена таблиц в правильном алфавитном порядке на своем языке.

Брит получает этот заказ: 'documents' - 'photos' - 'users'
Поляк получает: 'documents' - 'users' - 'photos' (Документы - Użytkownicy - Zdjęcia)
Немец получает: 'users' - 'documents' - 'photos' (Benutzer - Dokumente - Fotos)

Любая помощь очень ценится. Спасибо!

1 Ответ

0 голосов
/ 07 июля 2019

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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...