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?
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.
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));
aefxx
array_map( array('Sanitize', 'stripSlashesRecursive'), $value) ...