За последние 24 часа нас посетили 16466 программистов и 1677 роботов. Сейчас ищут 790 программистов ...

Как использовать array_walk_recursive() в классе

Тема в разделе "PHP для новичков", создана пользователем arbit, 13 июл 2013.

  1. arbit

    arbit Активный пользователь

    С нами с:
    20 июл 2012
    Сообщения:
    13
    Симпатии:
    0
    Здравствуйте!
    Подскажите пожалуйста правильный синтаксис

    Задача:
    Есть класс, в котором рекурсивно обрабатываются элементы массива,
    переданного аргументом в публичную функцию.
    Для рекурсии используется функция PHP
    array_walk_recursive ( array &input, callback funcname [, mixed userdata] )
    во втором параметре которой нужно передать НАЗВАНИЕ приватной функции класса.

    Вопрос:
    Как синтаксически правильно передать название ?
    Если передать "_recursion" то выдается ошибка об отсутствии функции, т.к.
    внутри класса обращение к членам класса через $this
    Заранее благодарен всем откликнувшимся!

    Код :
    class ABC
    {

    function checkdata($val)
    {
    array_walk_recursive($val, '_recursion');
    }

    private function _recursion(&$val, $key)
    {
    ...
    }

    }
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Код (PHP):
    1. <?php
    2. header('Content-Type: text/html; charset=utf-8');
    3.  
    4. class TestClass {
    5.     public function walkFunc($item, $key){
    6.         echo "key:",$key," item:",$item,'<br/>';
    7.     }
    8.  
    9.     public function checkdata($val){
    10.         array_walk_recursive($val, array(&$this, 'walkFunc'));
    11.     }
    12.  
    13.     public $testArr=array();
    14.     public function checkdata2(){
    15.         array_walk_recursive($this->testArr, array(&$this, 'walkFunc'));
    16.     }
    17. }
    18.  
    19. $obj = new TestClass();
    20.  
    21. $testArr=array("2", "3", "1", array("22","23","21"));//наш подопытный массив
    22.  
    23. //1 - тестовая функция "walkFunc" в классе, но вызыается извне
    24. array_walk_recursive($testArr, array(&$obj, 'walkFunc'));
    25. echo '<hr/>';
    26. //2 - тестовая фукнция вызывается из класса, данные извне
    27. $obj->checkdata($testArr);
    28. echo '<hr/>';
    29. //3 - тестовая фукнция вызывается из класса, данные из класса
    30. $obj->testArr = $testArr;
    31. $obj->checkdata2();
    32. echo '<p>Описание функции и пользовательские примеры [url="http://php.net/manual/function.array-walk-recursive.php"]array-walk-recursive[/url]</p>';
     
  3. arbit

    arbit Активный пользователь

    С нами с:
    20 июл 2012
    Сообщения:
    13
    Симпатии:
    0
    YSandro, спасибо большое за совет!
    Все работает!
    Если не затруднит напишите пару строк пожалуйста, о механизму реализации передачи
    имени функции через массив. Я что-то не понял...
    Индексированный массив. В первом элементе ссылка на объект класса, во втором - строка "имя функции".
    А каким образом элементы массива ( $this и строка ) увязываются между собой не могу понять...
    Не дайте остаться неучем пожалуйста. Очень хочу разобраться
    Спасибо!
     
  4. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Пардон, ссылка на описание функции была не верная, в конце нужно php, а не html. Исправил. На форуме кто-то пытался применить ИИ, но включили не на полную мощность, видимо. Ссылки переименовываются на местный домен.
    Индексированный? Ну, видимо, специально для работы внутри объектов есть второй вариант синтаксиса, в котором указывается сначала контекст, а потом уже имя функции.
    array_walk_recursive($массив, 'имя_функции') - простой вариант,
    array_walk_recursive($массив, array($контекст, 'имя_функции')) - для работы в контейнере.
    Вы могли сделать точно такой же вывод.
     
  5. arbit

    arbit Активный пользователь

    С нами с:
    20 июл 2012
    Сообщения:
    13
    Симпатии:
    0
    YSandro, спасибо большое!
    Вы мне очень помогли!