PHP - Создание списка путей из массива - PullRequest
1 голос
/ 21 марта 2019

У меня есть массив идентификаторов, которые сформированы в древовидную структуру для приложения типа хранилища.

Array image

Затем отображается древовидная структурааналогично этому

enter image description here

Я хочу создать список полного пути каждого элемента массива.

[366 => «Файлы», 356 => «Разное», 354 => «Фотографии», 368 = «Фотографии / города», 375 = «Фотографии / города / Англия», 376 = «Фотографии / города / Шотландия»]

Меню определяется пользователем, так что это всего лишь пример, оно может иметь гораздо больше уровней.

Имя для каждого элемента массива добавляется из массива имен, т.е. имен [376] (Фотографии)

Я пробовал несколько рекурсивных функций и боролся, я надеюсь, что кто-то, кто намного лучше в PHP, чем я, может помочь!Спасибо

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Эта функция будет делать то, что вы хотите. Он рекурсивно обходит дерево, создавая элементы для каждого ключа и передавая префиксы вниз через рекурсию, чтобы создать имя каждого элемента:

function make_paths($array, $names, $prefix = '') {
    $output = array();
    foreach ($array as $key => $arr) {
        $name = $prefix . ($prefix != '' ? '/' : '') . $names[$key];
        if (count($arr)) {
            $output = $output + make_paths($arr, $names, $name);
        }
        $output[$key] = $name;
    }
    return $output;
}

Выход:

Array (
    [375] => Photos/Cities/England
    [376] => Photos/Cities/Scotland
    [368] => Photos/Cities
    [354] => Photos
    [356] => Misc
    [366] => Files 
)

Демонстрация на 3v4l.org

1 голос
/ 21 марта 2019

Надеюсь, я понимаю, чего вы хотите достичь. В таком случае это может быть решением

<?php

$ids = [
  354 => [
    368 => [
      375,
      376
    ]
  ],
  356,
  366
];

$names = [
    354 => "Photos", 
    368 => "Cities",
    375 => "England",
    376 => "Scotland",
    356 => "Files",
    366 => "Misc"
];


print_r(build_list($ids));

function build_list($ids, $path = ""){
  global $names;
  $list = [];
  foreach($ids as $key => $value){
    if(is_array($value)){
      //$list[$key] = $path . $names[$key]; // uncomment if you need output (2)
      $list = array_replace_recursive($list, build_list($value, ($path . $names[$key] . "/")))
    }else{
      $list[$value] = $path . $names[$value];
    }
  }
  return $list;
}

?>

Выход (1)

Array
(
  [375] => Photos/Cities/England
  [376] => Photos/Cities/Scotland
  [356] => Files
  [366] => Misc
)

Выход (2)

Array
(
  [354] => Photos
  [368] => Photos/Cities
  [375] => Photos/Cities/England
  [376] => Photos/Cities/Scotland
  [356] => Files
  [366] => Misc
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...