Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2009, 18:54   #1
alexeurodnepr
 
Регистрация: 01.07.2009
Сообщений: 3
По умолчанию массив_рекурсия

подскажите пжл, как наполнить рекурсивно массив, желательно б пример на php но можно просто алгоритм СПАСИБО БОЛЬШОЕ!!!
alexeurodnepr вне форума Ответить с цитированием
Старый 01.07.2009, 19:05   #2
wall66
Участник клуба
 
Аватар для wall66
 
Регистрация: 04.10.2008
Сообщений: 1,485
По умолчанию

наполнить чем ?
PHP код:
<?
$array
=array(recursion_function());

function 
recursion_function()
{
    return array(
recursion_function());
}
?>
свободен...

Последний раз редактировалось wall66; 01.07.2009 в 19:07.
wall66 вне форума Ответить с цитированием
Старый 02.07.2009, 09:43   #3
alexeurodnepr
 
Регистрация: 01.07.2009
Сообщений: 3
По умолчанию

просто я не знаю как правильно указать рекурсивной функции путь в какой следующий массив нужно запихнуть значение т.к. внутри массива массивов может быть много а в тех еще и еще...
alexeurodnepr вне форума Ответить с цитированием
Старый 02.07.2009, 11:16   #4
wall66
Участник клуба
 
Аватар для wall66
 
Регистрация: 04.10.2008
Сообщений: 1,485
По умолчанию

Цитата:
Сообщение от alexeurodnepr Посмотреть сообщение
просто я не знаю как правильно указать рекурсивной функции путь в какой следующий массив нужно запихнуть значение т.к. внутри массива массивов может быть много а в тех еще и еще...
искренне жаль...
свободен...
wall66 вне форума Ответить с цитированием
Старый 02.07.2009, 14:05   #5
alexeurodnepr
 
Регистрация: 01.07.2009
Сообщений: 3
По умолчанию

wall66
в смысле это отследить не возможно?
---
вообщем я кину суть моей проблемы, я я постил на php.ru но там не дали ничего(((

--

вот код который делает:
1. Вытигавает все id с тех категорий которые не имеют parentid
2. Передает результат в рекурсивную
3. Потом если это массив а при первом заходе так и будет то сделать ID категорий ключами а в содержание поместить name -> имя категории, потом запускаем рекурсивную но где-то там на 3-м шаге прокол
--

индеск

PHP код:
<?php
  
function utf8encode($str,$encode="WINDOWS-1251")
  {
      return 
iconv($encode,'UTF-8',$str);
  }
  
  function 
utf8decode($str,$encode="WINDOWS-1251")
  {
      return 
iconv('UTF-8',$encode,$str);
  }
  
  function 
dump($arr,$mode=false,$stop=false)
  {   
      echo 
"<pre>";
      (!
$mode) ? print_r($arr) : var_dump($arr);
      echo 
"</pre>";
      
$stop ? exit() : "";
  }
  
///////////////
  //Настройки для xpath
  
$arr_category = array("catalog" => array("category/@id" => 1,
                                          
"category/@parentID" => 2,
                                          
"category" => 3));       
  
  
$i=0;
  
$xml simplexml_load_file('data.xml');
  
// создаем массив запросов
  
foreach($arr_category as $key => $item){
      foreach(
$item as $name => $col){
          
$query[$i] .= '//'.$key.'/'.$name;
          
$i++;
      }
  }
   
// извлекаем все то шо не равно парент айди
  
$query_cat "//catalog/category[not(@parentID)]";
  
// выполняем
  
$list=$xml->xpath($query_cat);
   
  if(!empty(
$list)){
         
      function 
recurs($r,$res,$xml,$p){
         
/*
          $r - первый запрос
          $res - как бы тот массив который я хочу получить...
          $xml - xml
          $p - id категории
   
          */
      
if(is_array($r)) {
  
          for (
$q=0;$q<count($r);$q++){
              
$id =  (string)$r[$q]->attributes();
              
$res[$id]['name'] =  utf8decode("$r[$q]\r\n");
              
dump($res);
              
recurs(false,$res,$xml,$id);
             
          }
         
     
      } else {
         
          
$list2[] = $xml->xpath("//catalog/category[@parentID='".trim($p)."']");
  
          for (
$w=0;$w<count($list2);$w++){
              
$name = (string)$list2[0][$w];
             
              
$res[$p][$id]['name'] = $name;
              
$id =  (string)@$list2[0][$w]->attributes();
              if(
$id) {
                  
recurs(false,$res,$xml,$id);   
              }
          }
      }
         
      }
         
      
$tt recurs($list,false,$xml,false);
     
  } else {
      
/* ... */
  
}
XML
Код:
<?xml version="1.0" encoding="windows-1251"?>
 <catalog>
     <category id="1" >Communication</category>
     <category id="2" >TV</category>
     <category id="3" parentID="2">DVD</category>
     <category id="4" parentID="3">blueray</category>
     <category id="5" parentID="3">cd</category>
     <category id="6" parentID="3">dvd</category>
     <category id="7" parentID="1">Mobile</category>
     <category id="8" parentID="7">iPhone</category>
     <category id="9" parentID="7">Nokia</category>
 </catalog>
хочу такое в итоге получить, но получаю, что-то не так т.к. видимо я не правильно передаю результат и он как бы сам себя затирает....
Код:
Array
(
    [1] => Array
        (
            [name] => Communication

            [7] => Array
                (
                    [name] => Mobile
                [7] => Array
               (
                  [name] => iPhone
                  [name] => Nokia
               )
                )

        )
      
   [2] => Array
        (
            [name] => TV

            [3] => Array
                (
                    [name] => DVD
                [] => Array
               (
                  [name] => blueray
                  [name] => cd
                  [name] => dvd
               )
                )

        )

)
alexeurodnepr вне форума Ответить с цитированием
Старый 02.07.2009, 14:18   #6
wall66
Участник клуба
 
Аватар для wall66
 
Регистрация: 04.10.2008
Сообщений: 1,485
По умолчанию

жаль что не понимаете...

на словах алгоритм такой:
  1. составить массив всех категорий (2)
  2. составить массив корневых категорий (1) без атрибута parent_id
  3. для каждого элемента массива (1) добавить подмассив содержащий те категории, parent_id которых равен id элемента массива (1)
  4. если добавленный подмассив не пустой (есть подкатегории) то выполнить шаг 3 для подмассива
свободен...
wall66 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц