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

В каждом элементе массива второе значение указывает на родителя самого элемента.Так, например, в первом массиве «City» является корневым элементом, а «Area» является первым дочерним, поскольку второй элемент «Area» (1) указывает на ключ «City».

Образцы данных

$locations = array(
    3 => array("Building", 2),
    2 => array("Area", 1),
    0 => array("Floor", 3),
    1 => array("City"),
    4 => array("Room", 0),

    13 => array("Building1", 12),
    12 => array("Area1", 11),
    14 => array("Room1", 10),
    10 => array("Floor1", 13),
    11 => array("City1")
);

Ожидаемый результат

Room > Floor > Building > Area > City

Room1 > Floor1 > Building1 > Area1 > City1

Мое решение

$route = [];

foreach ($locations as $locationKey => $locationArray) {

    if (!isset($locationArray[1])) continue;

    $nextLocation = $locations[$locationArray[1]][0];
    $route[] = $nextLocation;
}

Но это не такдобавить массив без индекса, указанного в массиве, например, индекс 4 array("room", 0);

Кроме того, я не могу понять, как разделить маршруты, если один маршрут закончен

Вывод, который я получаю:

Array
(
[0] => Area
[1] => City
[2] => Building
[3] => Floor
[4] => Area1
[5] => City1
[6] => Floor1
[7] => Building1
)

1 Ответ

5 голосов
/ 19 марта 2019

Вы можете сделать это:

Первый словарь сохранения для того, как получить для каждого узла и корни:

$dic = [];
$roots = [];
foreach($locations as $k => $e) {
    if (count($e) == 2)
        $dic[$e[1]] = $k;
    else
        $roots[] = $k;
}

Затем выполните цикл для всего корня и создайте путь:

foreach($roots as $root) {
    $path = [];
    $node = $root;
    while (isset($dic[$node])) {
        $path[] = $locations[$node][0];
        $node = $dic[$node];
    }
    $path[] = $locations[$node][0];
    echo implode(",", array_reverse($path)) . PHP_EOL;
}

Живой пример: 3v4l

...