Логика, требуемая в этом случае, может быть простой или нет, но я не мог понять это.Итак, я прошу о помощи.
После запроса я получаю массив, который выглядит примерно так:
Array=>
[0]=>
['name'] = item1
['id'] = 1
['parent_id'] = 0
[1]=>
['name'] = item2
['id'] = 2
['parent_id'] = 1
[2]=>
['name'] = item3
['id'] = 3
['parent_id'] = 5
Теперь мне нужно создать пути для каждого элементав этом списке.Пути будут выглядеть примерно так: /item1
для элемента 1 и что-то вроде /item1/item2
для элемента 2.
Примечание. Элементы не обязательно находятся в порядке.Родительский элемент может появиться после того, как его дочерний элемент ...
Итак, в принципе, мне нужен цикл (вероятно, больше 1), чтобы при обнаружении элемента он записывал имя элемента, которому предшествует косая черта.Затем он смотрит на parent_id
и записывает имя parent_id
, которому предшествует косая черта.
Затем он смотрит на parent_id
родителя и записывает это имя, которому предшествует косая черта.Он продолжает делать это, пока не встретит parent_id
из 0. В этот момент он присваивает значение массиву, что-то вроде paths['item2'] = "/item1/item2"
, переходит к следующему идентификатору и повторяется!
Спасибоза вашу помощь, хорошего дня!
edit: Исправлен идентификатор элемента 3, все элементы имеют разные идентификаторы.Меня попросили улучшить вопрос: окончательный выходной массив должен выглядеть примерно так:
Array=>
["item1"]="/item1"
["item2"]="/item1/item2"
["item3"]="/item5/item3"
Окончательный результат будет в виде HTML-формы выбора с каждым элементом в качестве опции, и мне нужно иметь егопуть, связанный каким-либо образом, либо со скрытым полем, либо просто через Ajax, либо с чем-то.
edit: я исправил проблему.Я просто подумал, что напишу решение здесь на тот случай, если кто-нибудь еще наткнется на это.Примечание: Тем не менее, не совсем уверен, как это работает, но это работает!Это может быть неэффективно, я не знаю.
function getCollPath($proj_list, $length){
$total_path = "";
$paths = array();
for ($j = 0; $j < $length + 1; $j++){
if (isset($proj_list[$j])){
$id = $j;
$name = $proj_list[$j]['name'];
$total_path = getItemPath($proj_list, $id, NULL);
$paths[$name] = $total_path;
}
}
return $paths;
}
function getItemPath($proj_list, $current_id, $path){
$current_parent_id = $proj_list[$current_id]['parent_id'];
$current_name = $proj_list[$current_id]['name'];
$current_path = "/".$current_name;
if ($current_parent_id == 0){
if (isset($path)){
return $current_path.$path;
}
else{
return $current_path;
}
}
else{
if (!isset($path)){
$path = $current_path;
}
return getItemPath($proj_list, $current_parent_id, $path);
}
}