2012-01-05 9 views
25

ho questofunzione array_map in php con il parametro

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

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

mi piacerebbe mettere un altro parametro per la mia funzione per ottenere qualcosa di simile

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

Qualcuno mi può aiutare? Ho provato un sacco di cose ma non funziona nulla

+0

Cosa vuoi? $ item2' essere? Un valore costante? – knittl

+1

Penso che la tua chiamata a 'array_map' sia difettosa. Potresti fornire un esempio adeguato? –

+0

array_map: il numero di parametri accettati dalla funzione di callback deve corrispondere al numero di array passati a array_map() trucco: è possibile utilizzare un array come titolare del parametro ad es. array array_map (richiamabile $ callback, array_to_map, array ('param')) – ravisoni

risposta

3

Oltre alla creazione di un oggetto mapper, non c'è molto che si possa fare. Per esempio:

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

E poi dentro la funzione, invece di creare il proprio mapper, utilizzare la nuova classe:

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

Questo vi permetterà di creare un mapping personalizzato che può restituire qualsiasi tipo di informazioni ... E puoi complessare il tuo customMapper per accettare più campi o configurazioni facilmente.

9

Considerare l'utilizzo di array_walk. Ti consente di passare user_data.

+0

Ma come possiamo passare i parametri se più di un argomento? –

22

PHP array_map supporta un terzo parametro che è una matrice che rappresenta i parametri da passare alla funzione di callback. Ad esempio tagliare il / char da tutti gli elementi dell'array può essere fatto in questo modo:

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

Molto più facile che utilizzando le funzioni personalizzati o altre funzioni simili array_walk, ecc

* NB. Come indicato nei commenti qui sotto, ero un po 'frettoloso e il terzo parametro ha effettivamente bisogno di essere la stessa lunghezza del secondo che è compiuto con array_fill().

Le uscite di cui sopra:

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

Non sembra funzionare come hai descritto. Provalo. Il terzo parametro deve essere un array di elementi - ognuno di questi elementi viene passato come argomento insieme all'elemento corrispondente dall'array che viene tagliato: '$ trimmed = array_map ('trim', array ('/ some /', '/link '), array ('/','/')); ' – tmt

+0

@cascaval Ho corretto la mia parte dopo aver notato lo stesso e ho dimenticato di tornare a postare l'aggiornamento.Grazie per l'avviso, si prega di consultare la risposta aggiornata, e se utile, si prega di ri-votare;) – oucil

+1

Ora funziona bene. +1 – tmt

22

è possibile utilizzare un anonymous function e trasmettere il valore della variabile locale nella vostra myarraymap secondo argomento in questo modo:

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 può essere sufficiente per passare giusto valore all'interno del corpo della funzione anonima:

function($item) { return myarraymap($item, 'some_value'); } 
Problemi correlati