вопрос из серии "то ли лыжи не едут, толи одно из двух..... Код (Text): Array ( [0] => Array ( [id] => 15 [pid] => 0 [module_id] => comments1 ( [0] => Array ( [id] => 16 [pid] => 15 [module_id] => comments1 ( [0] => Array ( [id] => 21 [pid] => 16 [module_id] => comments1 ) ) ) ) ) Подскажите пожалуйста, как можно посчитать на "каком уровне вложенности" от "корневого массива" находится элемент с id 21 (сейчас он на третьем) (ну вобщем любой элемент, ибо функция должна быть универсальной, вычислять любой уровень вложенности... если что, то нужно это для построения "дерева"... записать сразу при добавлении записи в БД уровень от корня дерева нет возможности, поэтому надо посчитать его при извлечении..... Хотя может и можно при добавлении записи, но я не знаю как
Сделать print_r с return=true, посчитать количество открывающих скобок на отдельной строке до нужного элемента и вычесть количество закрывающих скобок на отдельной строке до нужного элемента. И вычесть 1. Ой, а еще можно посчитать количество \t, которые идут до [id] => 21 и поделить пополам (наверное). %)
продолжаем делать из себя дуру Код (Text): function make_tree() { $tree = array(); $query = mysql_query('SELECT * FROM `comments`'); if (! $query) return $tree; $nodes = array(); $keys = array(); while (($node = mysql_fetch_assoc($query))) { $nodes[$node['id']] =& $node; //заполняем список веток записями из БД $keys[] = $node['id']; //заполняем список ключей(ID) unset($node); } mysql_free_result($query); foreach ($keys as $key) { /** * если нашли главную ветку(или одну из главных), то добавляем * её в дерево */ if ($nodes[$key]['pid'] === '0') $tree[] =& $nodes[$key]; /** * else находим родительскую ветку и добавляем текущую * ветку к дочерним элементам родит.ветки. */ else { if (isset($nodes[ $nodes[$key]['pid'] ])) //на всякий случай, вдруг в базе есть потерянные ветки { if (! isset($nodes[ $nodes[$key]['pid'] ]['nodes'])) //если нет поля определяющего наличие дочерних веток $nodes[ $nodes[$key]['pid'] ]['nodes'] = array(); //то добавляем к записи узел (массив дочерних веток) на данном этапе $nodes[ $nodes[$key]['pid'] ]['nodes'][] =& $nodes[$key]; } } } return $tree; } $abc = $this ->make_tree(0, 0); - возвращает то же что я написал в первом посте..... ЗЫ чую у меня получается
Код (Text): <?php $level = 0; $v = current($array); while (is_array($v)) { $level++; $v = current($array); } echo $level;
ну что ж вы за люди то такие vs - от Вас не ожидал.... В любом случае спасибо за науку, рекурсию мне видимо пока не осилить, будем "плюсадинить" в БД при записи....
это зацикливает все на свете во всяком случае в том виде, в котором Вы написали... ЗЫ сервак почти упал
все замечательно, получил я свои 1, 2, 3, но появилось одно НО: если на входе такой массив Код (Text): Array ( [0] => Array ( [id] => 15 [pid] => 0 [module_id] => comments1 ( [0] => Array ( [id] => 16 [pid] => 15 [module_id] => comments1 ) [1] => Array ( [id] => 21 [pid] => 16 [module_id] => comments1 ) ) ) ) то на выходе я должен получить 1,2,2.....а я получаю 1,2,3.... как исправить?
Может я чего-то не понимаю, но: http://php.net/manual/ru/function.current.html Функция current() просто возвращает значение элемента массива, на который указывает его внутренний указатель. Она не перемещает указатель куда бы то ни было. Если внутренний указатель находится за пределами списка элементов или массив пуст, current() возвращает FALSE. Ну и даже если добавить next или же заменить все на each (как рекомендуется ниже на странице, указанной выше), то это будет работать только с одномерным массивом. Дмитрий, а Вы можете сформулировать корректно, что надо в результате получить? Надо только вычислить вложенность или же что-то еще? Если только вложенность, то какие исходные данные? Насколько я понимаю, массива, который Вы описали в начале топика, у Вас изначально нет, верно?
Мой пример считает вложенность труъ-многомерного массива, в котором до последнего уровня _только_ вложенные массивы, и только на последнем - данные. Таким образом, он погружаются в направлении $arr[0][0][0][0]... пока этот самый [0] будет массивом. Если $arr[0][0][0] - массив, а $arr[0][1] - нет, то это какая угодно структура, но не многомерный массив.
Код (Text): $level = 0; $v = current($nodes); while (is_array($v)) { $level++; $v = current($v); } echo $level."|<br>";
и каким образом ты умудряешься получить значения через запятые и вобще более одного значения? данный код такие фокусы не позволяет =)
asokol совершенно верно!!! Смотрите: я выбираю данные из БД (если конкретно,то комменты к определенной статье) далее Код (Text): $tree = array(); $nodes = array(); $keys = array(); while ($row = mysql_fetch_assoc($result)) { $nodes[$row['id']] =& $row; //заполняем список веток записями из БД $keys[] = $row['id']; //заполняем список ключей(ID) unset($row); } $level = 0; foreach ($keys as $key) { if ($nodes[$key]['pid'] === '0') $tree[] =& $nodes[$key]; else { if (isset($nodes[ $nodes[$key]['pid'] ])) //на всякий случай, вдруг в базе есть потерянные ветки { if (! isset($nodes[ $nodes[$key]['pid'] ]['nodes'])) //если нет поля определяющего наличие дочерних веток { $nodes[ $nodes[$key]['pid'] ]['nodes'] = array(); //то добавляем к записи узел (массив дочерних веток) на данном этапе } $nodes[ $nodes[$key]['pid'] ]['nodes'][] =& $nodes[$key]; } $v = current($nodes); while (is_array($v)) { $level++; $v = current($v);} echo $level."|<br>"; // в результате в $tree получается массив из корневого топика. "уровень вложенности" этого массива произволен и может быть каким угодно. } $level верно считает, только если массив как в первом посте. 1,2,3 если же массив имеет другую структуру, получается то же самое..... а мне надо получить, даже не знаю как объяснить, если на пальцах, то "уровень смещения "вложенного массива" "для того, что бы правильно вывести дерево сообщений.
через запятые я сам написал, если так проще то получаю 123... несколько значений, т.к. вычисления эти в цикле производятся
Бяда в том Код (Text): Array ( [0] => Array ( [id] => 15 [pid] => 0 [module_id] => comments1 ( [0] => Array ( [id] => 16 [pid] => 15 [module_id] => comments1 ) [1] => Array ( [id] => 21 [pid] => 16 [module_id] => comments1 ) ) ) ) что для записи с id 21 я должен получить значение 2, а получаю 3... 2 - это образно говоря 2 пробела, т.е. в итоге я должен вывести Код (Text): id15 id16 id21 а не Код (Text): id15 id16 id21
если хочешь увидеть мой вариант, то тогда тебе придется придумать название для того члена массива, в котором живут другие массивы.