Подтвердить что ты не робот

Вызов функции из класса с помощью array_walk_recursive

Это упрощенная версия класса, который у меня есть в php:

class someClass {
   public function edit_array($array) {
      array_walk_recursive($array, 'edit_value');
   }
   public function edit_value(&$value) {
      //edit the value 
   }
}

Теперь отправка имени функции из класса в array_walk_recursive явно не работает. Тем не менее, есть ли работа, отличная от воссоздания array_walk_recursive, используя цикл (я сохраню это как последнее средство)? Спасибо заранее!

4b9b3361

Ответ 1

для этой функции нужно статически ссылаться. Я успешно использовал этот код:

<?php

class someClass {
   public function edit_array($array) {
      array_walk_recursive($array, 'someClass::edit_value');
   }
   public static function edit_value(&$value) {
      echo $value; 
   }
}

$obj = new SomeClass();

$obj->edit_array(array(1,2,3,4,5,6,7));

Ответ 2

Ваши методы не определены как статические, поэтому я предполагаю, что вы создаете экземпляр. В этом случае вы можете пройти $this:

public function edit_array($array) {
    array_walk_recursive($array, array($this, 'edit_value'));
}

Ответ 3

Try:

class someClass {
   static public function edit_array($array) {
      array_walk_recursive($array, array(__CLASS__,'edit_value'));
   }
   static public function edit_value(&$value) {
      //edit the value 
   }
}

NB: Я использовал __CLASS__, так что изменение имени класса не препятствует выполнению. Вместо этого вы могли бы использовать "someClass".

Или в случае экземпляров:

class someClass {
   public function edit_array($array) {
      array_walk_recursive($array, array($this,'edit_value'));
   }
   public function edit_value(&$value) {
      //edit the value 
   }
}

Ответ 4

Вы также можете сделать это inline..

array_walk_recursive($myArray, function (&$item){
   $item = mb_convert_encoding($item, 'UTF-8');
});