2011-04-19 20 views
12

Ésta es una versión simplificada de una clase que tengo en php:función que llama desde dentro de la clase con array_walk_recursive

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

Ahora enviando el nombre de la función desde dentro de la clase a array_walk_recursive, obviamente, no funciona. Sin embargo, ¿hay algo que no sea la recreación de array_walk_recursive utilizando un bucle (lo guardaré como último recurso)? ¡Gracias por adelantado!

Respuesta

19

la función tiene que ser referenciado staticly. Utilicé este código con éxito:

<?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)); 
6

Probar:

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: que utilizan __CLASS__ de modo que el cambio de nombre de la clase no impide la ejecución. Usted podría haber usado "someClass" en su lugar también.

O en el caso de instancias:

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

__CLASS__ sólo es necesario si usted está tratando de llamar de forma estática. – Zimzat

16

Sus métodos no están definidos como estáticos, así que supongo que está creando instancias. En ese caso, puede pasar $this:

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

Esta es la mejor respuesta. La respuesta aceptada no responde realmente a la pregunta, solo proporciona una alternativa para las clases estáticas, que a veces no son deseables. – OMA

0

También puede hacerlo en línea ..

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