Cómo implementar métodos de clase en array_map’s callable [duplicate]

4 minutos de lectura

Avatar de usuario de Justin
justin

Estoy tratando de crear una clase para manejar matrices, pero parece que no puedo obtener array_map() para trabajar en ella.

$array = [1,2,3,4,5,6,7,8,9,10];
class test {
    public $values;

    public function adding($data) {
        $this->values = array_map($this->dash(), $data);
    }

    public function dash($item) {
        return '-' . $item . '-';
    }

}

var_dump($array);

$test = new test();
$test->adding($array);

// Expected: -1-,-2-,-3-,-4-... 
var_dump($test->values);

Esto produce

array(10) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10) }

Warning: Missing argument 1 for test::dash(), called in [...]\arraytesting.php on line 11 and defined in [...]\arraytesting.php on line 15

Warning: array_map() expects parameter 1 to be a valid callback, function '--' not found or invalid function name in [...]\arraytesting.php on line 11 NULL

¿Qué estoy haciendo mal o esta función simplemente no funciona dentro de las clases?

Avatar de usuario de Jon
Jon

estas especificando dash como la devolución de llamada de forma incorrecta.

Esto no funciona:

$this->classarray = array_map($this->dash(), $data);

Esto hace:

$this->classarray = array_map([$this, 'dash'], $data);

Lea acerca de las diferentes formas que puede tomar una devolución de llamada aquí.

  • Gracias por la reproducción rápida. Lo tengo funcionando y gracias por tu ayuda. Me preguntaba si tiene más artículos sobre la devolución de llamada y cómo especificar si es correcto.

    – Justin

    24 de marzo de 2011 a las 16:49

  • @Justin: Echa un vistazo aquí: stackoverflow.com/questions/48947/…

    – Jon

    24 de marzo de 2011 a las 19:01

  • incluso funciona estáticamente como array_map( @[ self, ‘dash’ ] )

    – bortunac

    25 de junio de 2016 a las 22:53


  • ¿Cómo se puede pasar un parámetro con la función de guión?

    – Nielsapp

    10 mayo 2018 a las 11:33


  • @Nielsapp no ​​puede directamente, debe pasar un invocable que vinculará efectivamente los argumentos que desea, por ejemplo array_map(function($item) { return $this->dash($item, 'additional argument'); }, $data)

    – Jon

    14 de mayo de 2018 a las 9:49

Cuando se usa un método de clase como devolución de llamada para funciones como array_map() y usort(), debe enviar la devolución de llamada como una matriz de dos valores. El segundo valor es siempre el nombre del método como una cadena. El primer valor es el contexto (nombre de clase u objeto)

// Static outside of class context
array_map( array( 'ClassName', 'methodName' ), $array );

// Static inside class context
array_map( array( __CLASS__, 'methodName' ), $array );

// Non-static outside of object context
array_map( array( $object, 'methodName' ), $array );

// Non-static inside of object context
array_map( array( $this, 'methodName' ), $array );

array_map($this->dash(), $data) llamadas $this->dash() con 0 argumentos y usa el valor de retorno como la función de devolución de llamada para aplicar a cada miembro de la matriz. Usted quiere array_map(array($this,'dash'), $data) en cambio.

debe leer

$this->classarray = array_map(array($this, 'dash'), $data);

los array-la cosa es la Devolución de llamada de PHP para un método de instancia de objeto. Las devoluciones de llamada a funciones regulares se definen como cadenas simples que contienen el nombre de la función ('functionName'), mientras que las llamadas a métodos estáticos se definen como array('ClassName, 'methodName') o como una cadena como esa: 'ClassName::methodName' (esto funciona a partir de PHP 5.2.3).

array_map toma una llamar de vuelta como su primer parámetro.

Y una devolución de llamada a un método estático se escribe así:

array('classname', 'methodname')

Lo que significa que, en su caso específico, usaría:

array_map(array('stripSlashesRecursive', ''), $value);

Para más información sobre devoluciones de llamadavea esta sección del manual de PHP : Pseudotipos y variables utilizados en esta documentación – devolución de llamada.

Avatar de usuario de Aris
Aris

En caso de que la clase pertenezca a un espacio de nombres diferente, debe usar el nombre completo de la clase del espacio de nombres. A continuación se muestra un ejemplo que utiliza una clase de utilidad CakePHP:

Esto no funcionará:

array_map(array('Inflector', 'humanize'), $some_array));

Esto funcionará:

array_map(array('Cake\Utility\Inflector', 'humanize'), $some_array));

avatar de usuario de aefxx
aefxx

array_map( array('Sanitize', 'stripSlashesRecursive'), $value) ...

¿Ha sido útil esta solución?