Проблемы с логикой итерации массива PHP - PullRequest
1 голос
/ 16 декабря 2011

Логика, требуемая в этом случае, может быть простой или нет, но я не мог понять это.Итак, я прошу о помощи.

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

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);
}
}

1 Ответ

1 голос
/ 16 декабря 2011

Рекурсивная функция.Он ищет элемент массива с id = child.parent_id.Затем он вызывает self с текущим parent_id в качестве параметра, пока не будет достигнут элемент с parent_id = "" или "0".Он должен вернуть сегмент хлебной крошки родительскому вызову, поэтому исходный вызов получает весь маршрут

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...