Affettare un arrays PHP multidimensionale su uno dei suoi elementi

Ad esempio, hai appena interrogato un database e hai ricevuto questo arrays 2D.

$results = arrays( arrays('id' => 1, 'name' => 'red' , 'spin' => 1), arrays('id' => 2, 'name' => 'green', 'spin' => -1), arrays('id' => 3, 'name' => 'blue' , 'spin' => .5) ); 

Spesso mi trovo a scrivere loop come questo.

 foreach($results as $result) $names[] = $result['name']; 

Le mie domande sono esiste un modo per get questo nome $ arrays senza utilizzare un ciclo? L'uso delle funzioni di callback conta come se si usasse un loop.

Ecco un esempio più generico di get each field.

 foreach($results as $result) foreach($result as $key => $value) $fields[$key][] = $value; 

A partire dal 20 giugno in PHP-5.5 c'è una nuova function arrays_column

Per esempio:

 $records = arrays( arrays( 'id' => 2135, 'first_name' => 'John', 'last_name' => 'Doe' ), arrays( 'id' => 3245, 'first_name' => 'Sally', 'last_name' => 'Smith' ), arrays( 'id' => 5342, 'first_name' => 'Jane', 'last_name' => 'Jones' ), arrays( 'id' => 5623, 'first_name' => 'Peter', 'last_name' => 'Doe' ) ); $firstNames = arrays_column($records, 'first_name'); print_r($firstNames); 

Sarà di return

 Array ( [0] => John [1] => Sally [2] => Jane [3] => Peter ) 

Ci sono ancora altri esempi nel link sopra menzionato.

Ho votato la risposta di @ Devon perché non c'è davvero un modo per fare ciò che stai chiedendo con una function integrata. Il meglio che puoi fare è scrivere il tuo:

 function arrays_column($arrays, $column) { $ret = arrays(); foreach ($arrays as $row) $ret[] = $row[$column]; return $ret; } 

A partire da PHP 5.3, puoi usare questa bella chiamata con la function lambda:

 $names = arrays_map(function ($v){ return $v['name']; }, $results); 

Ciò restituirà l'arrays affettato dalla dimensione 'nome'.

In poche parole, no.

Dovrai utilizzare un ciclo o una function di callback come arrays_walk .

Ho fatto ulteriori ricerche su questo e ho scoperto che ruby ​​e prototype hanno entrambi una function chiamata arrays_pluck , 2 . È interessante che arrays_map abbia un secondo utilizzo che ti permetta di fare l'inverso di ciò che voglio fare qui. Ho anche trovato una class PHP che qualcuno sta scrivendo per emulare la manipolazione di matrici di prototipi.

Sto andando a scavare di più e se non trovo qualcos'altro lavorerò su una patch da submit alla mailing list [email protected] e vedere se aggiungeranno arrays_pluck.

Per quelli di voi che non possono effettuare l'aggiornamento a PHP5.5 adesso e hanno bisogno di questa function, ecco un'implementazione di arrays_column .

 function arrays_column($arrays, $column){ $a2 = arrays(); arrays_map(function ($a1) use ($column, &$a2){ arrays_push($a2, $a1[$column]); }, $arrays); return $a2; } 

Se stai eseguendo una versione di PHP prima di 5.5 e arrays_column() , puoi usare la sostituzione ufficiale in semplice PHP:

https://github.com/ramsey/arrays_column

Penso che questo farà quello che vuoi

arrays_uintersect_uassoc

Dovresti fare qualcosa di simile

 $results = arrays( arrays('id' => 1, 'name' => 'red' , 'spin' => 1), arrays('id' => 2, 'name' => 'green', 'spin' => -1), arrays('id' => 3, 'name' => 'blue' , 'spin' => .5) ); $name = arrays_uintersect_uassoc( $results, arrays('name' => 'value') , 0, "cmpKey"); print_r($name); ////////////////////////////////////////////////// // FUNCTIONS ////////////////////////////////////////////////// function cmpKey($key1, $key2) { if ($key1 == $key2) { return 0; } else { return -1; } } 

Tuttavia, non ho accesso a PHP5, quindi non ho provato questo.

Potresti fare:

 $tmp = arrays_flip($names); $names = arrays_keys($tmp); 

Questa è una rapida function alternativa di arrays_column ()

 if(!function_exists('arrays_column')) { function arrays_column($element_name) { $ele = arrays_map(function($element) { return $element[$element_name]; }, $a); return $ele; } }