2012-01-05 37 views
25

que tiene estefunción array_map en PHP con el parámetro

$ids = array_map(array($this, 'myarraymap'), $data['student_teacher']); 

function myarraymap($item) { 
    return $item['user_id']; 
} 

me gustaría poner otro parámetro a mi función para obtener algo así como

function myarraymap($item,$item2) { 
    return $item['$item2']; 
} 

Puede alguien me puede ayudar? Intenté muchas cosas pero nada funciona

+0

¿Qué quiere ' $ item2' para ser? Un valor constante? – knittl

+1

Creo que su llamada a 'array_map' es defectuosa. ¿Podría darnos un ejemplo apropiado? –

+0

array_map: El número de parámetros que acepta la función de devolución de llamada debe coincidir con el número de matrices que se pasaron a array_map() Truco: puede usar una matriz como titular de parámetros p. array array_map (invocable $ callback, array_to_map, array ('param')) – ravisoni

Respuesta

3

Además de crear un objeto mapeador, no hay mucho que pueda hacer. Por ejemplo:

class customMapper { 
    private $customMap = NULL; 
    public function __construct($customMap){ 
     $this->customMap = $customMap; 
    } 
    public function map($data){ 
     return $data[$this->customMap]; 
    } 
} 

Y a continuación, dentro de su función, en lugar de crear su propio asignador, utilice la nueva clase:

$ids = array_map(array(new customMapper('param2'), 'map'), $data['student_teacher']); 

Esto le permitirá crear un asignador personalizado que puede devolver cualquier tipo de información ... Y puede complejizar su customMapper para aceptar más campos o configuración fácilmente.

9

Considere usar array_walk. Le permite pasar user_data.

+0

Pero, ¿cómo podemos pasar parámetros si hay más de un argumento? –

22

PHP array_map admite un tercer parámetro que es una matriz que representa los parámetros para pasar a la función de devolución de llamada. Por ejemplo recortar el / carbón de todos los elementos de la matriz se puede hacer así:

$to_trim = array('/some/','/link'); 
$trimmed = array_map('trim',$to_trim,array_fill(0,count($to_trim),'/')); 

Mucho más fácil de utilizar funciones personalizadas, u otras funciones como array_walk, etc.

* N.B. Como se señala en los comentarios a continuación, estaba un poco apresurado y el tercer parámetro realmente debe ser del mismo largo que el segundo que se logra con array_fill().

Las salidas anteriores:

array(2) { 
    [0]=> 
    string(4) "some" 
    [1]=> 
    string(4) "link" 
} 
+1

Parece que no funciona de la manera que describiste. Pruébalo. El tercer parámetro debe ser una matriz de elementos: cada uno de estos elementos se pasa como un argumento junto con el elemento coincidente de la matriz que se está recortando: '$ trimmed = array_map ('trim', array ('/ some /', '/link '), array ('/','/')); ' – tmt

+0

@cascaval Lo había corregido por mi cuenta después de notar lo mismo y olvidé volver a publicar la actualización.Gracias por el aviso, consulte la respuesta actualizada, y si es útil, vuelva a votar;) – oucil

+1

Ahora funciona bien. +1 – tmt

22

puede utilizar un anonymous function y transmitir el valor de la variable local en su segundo argumento myarraymap esta manera:

function myarraymap($item,$item2) { 
    return $item[$item2]; 
} 

$param = 'some_value'; 

$ids = array_map(
    function($item) use ($param) { return myarraymap($item, $param); }, 
    $data['student_teacher'] 
); 

Normalmente, puede ser suficiente con sólo pasar el valor dentro del cuerpo de la función anónima:

function($item) { return myarraymap($item, 'some_value'); } 
Cuestiones relacionadas