Рекурсивный массив

Тема в разделе "Мегафлуд", создана пользователем drwhite, 15 сен 2008.

Статус темы:
Закрыта.
  1. drwhite

    drwhite Прохожие

    Чтобы начать тему в разделе PHP для начинающих нужно иметь пять постов.

    Как выявить рекурсию в массиве, чтобы не писать в рекурсивных функциях счетчик вложенности уровня?

    PHP:
    $arr = Array('k1' => 'v1');
    $arr[] = $arr;

    print_r($arr)

    Array
    (
        [
    k1] => v1
        
    [0] => Array
     *
    RECURSION*
    )
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Массив не может быть рекурсивным по определению.
    Напряги мышцы и напиши по человечески.
     
  3. Jameson

    Jameson Читатель

    Заблокирован
    Регистр.:
    25 июн 2007
    Сообщения:
    406
    Симпатии:
    92
  4. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Тоже не понятно каким боком.

    is_array просто вернёт true в случае массива (даже если он одномерный).

    определить многомерность при помощи одного foreach тоже не получиться.
     
  5. gl0vv

    gl0vv Создатель

    Регистр.:
    20 авг 2008
    Сообщения:
    16
    Симпатии:
    2
    Вот простой метод получения пар ключ-значение для многомерных массивов с помощью итераторов библиотеки SPL:
    http://habrahabr.ru/blogs/php/31422/
     
  6. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Загнётся этот метод на вложенных массивах. Пробовал. Вернулся к старой доброй рекурсии.
     
  7. drwhite

    drwhite Прохожие

    Ну, может, не очень по-человечески, но по-другому пока не знаю как описать проблему:
    PHP:
    01 function processStringRecursive($data '')
    02 {
    03   if(is_array($data))
    04   {
    05     foreach($data as $k => $v)
    06     {
    07       если ($v ссылается или содержит $data)
    08       {
    09         continue;
    10       };//
    11             
    12       $res_data
    [$k] = processStringRecursive($data[$k]);
    13     };//foreach
    14   }
    15   else if(is_scalar($data))
    16   {
    17     $res_data htmlspecialchars($data);
    18   }
    19   else
    20   {
    21     $res_data false;
    22   };//
    23   return $res_data;
    24 }//func

    $test_data = Array();
    $test_data[] = '<p>P1</p>';
    $test_data[] = Array('<p>P21</p>''<p>P22</p>');
    $test_data[] = '<p>P3</p>';
    $test_data[] = $test_data;

    echo 
    '<pre>';
    print_r(processStringRecursive($test_data));
    echo 
    '</pre>';
    Как сторку 07 перевести на php?
     
  8. Jameson

    Jameson Читатель

    Заблокирован
    Регистр.:
    25 июн 2007
    Сообщения:
    406
    Симпатии:
    92
    я понял вопрос по-своему: что ТС хотел определить наличие вложенных массивов в данном массиве.

    соответственно

    в foreach предлагается перебирать все элементы и каждый проверять
    if (is_array($arr) && count($arr))
    значит вложенный массив.

    другое дело, что он и вправду имел в виду рекурсивный массив :D
     
  9. drwhite

    drwhite Прохожие

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

    Так строчка
    Код:
    if($v содержит/ссылается на $data)
    {
      continue;
    }
    
    на php переводится или нет?

    Да, еще, что такое «ТС»?
     
  10. BaduN

    BaduN Постоялец

    Регистр.:
    18 янв 2008
    Сообщения:
    80
    Симпатии:
    10
    ТС - топикстартер (тот кто тему открыл), то бишь ТЫ. :)
     
Статус темы:
Закрыта.