2008-10-02 10 views
21

Sagen Sie zum Beispiel, Sie haben gerade eine Datenbank abgefragt und dieses 2D-Array erhalten.Schneiden eines mehrdimensionalen PHP-Arrays über eines seiner Elemente

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

Oft finde ich Schleifen wie diese schreiben.

Meine Fragen gibt es eine Möglichkeit, dieses Array $ Namen ohne eine Schleife zu bekommen? Die Verwendung von Callback-Funktionen gilt als Verwendung einer Schleife.

Hier ist ein allgemeineres Beispiel für das Abrufen aller Felder.

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

FWIW, ich habe eine Antwort auf eine ähnliche Frage hier zur Verfügung gestellt: http://Stackoverflow.com/a/10660002/128346. –

Antwort

23

Ab 20. Juni in PHP-5.5 gibt es eine neue Funktion array_column

Zum Beispiel:

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


$firstNames = array_column($records, 'first_name'); 
print_r($firstNames); 

Will return

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

Es gibt noch weitere Beispiele in der oben erwähnten Verknüpfung.

+0

Wow! Freut mich, diese Funktion zu finden. Ziemlich handlich und einfach im Vergleich zu 'array_map()'. Müssen jedoch die Leistung vergleichen. – Fr0zenFyr

5

Einfach gesagt, nein.

Sie müssen eine Schleife oder eine Rückruffunktion wie array_walk verwenden.

+2

Das stimmt nicht mehr. PHP 5.5 bietet eine eingebaute 'array_column' Funktion :) –

14

Ich habe @ Devons Antwort gewählt, weil es wirklich keine Möglichkeit gibt, das zu tun, was Sie mit einer eingebauten Funktion verlangen. Das Beste, was Sie tun können, ist schreiben Sie Ihre eigene:

function array_column($array, $column) 
{ 
    $ret = array(); 
    foreach ($array as $row) $ret[] = $row[$column]; 
    return $ret; 
} 
+4

Bugs meine, dass du' ret' noch nicht deklariert hast, auch wenn du das technisch in PHP nicht brauchst. ('$ ret = array();') – mpen

+0

@Quentin Bitte informieren Sie den antwortenden Benutzer über alles, was Sie für falsch halten, anstatt es zu korrigieren. –

+1

Das war Marks Kommentar über die Initialisierung von '$ ret'. Ich hob Marks Kommentar auf und bot eine Änderung in der Antwort mit einer beigefügten Erklärung an. Ich hätte hier auch einen Kommentar hinzufügen sollen? – Quentin

0

ich denke, das tun, was Sie

array_uintersect_uassoc

möchte Sie haben so etwas wie dieses

$results = array(
    array('id' => 1, 'name' => 'red' , 'spin' => 1), 
    array('id' => 2, 'name' => 'green', 'spin' => -1), 
    array('id' => 3, 'name' => 'blue' , 'spin' => .5) 
); 
$name = array_uintersect_uassoc($results, array('name' => 'value') , 0, "cmpKey"); 
print_r($name); 

////////////////////////////////////////////////// 
// FUNCTIONS 
////////////////////////////////////////////////// 
function cmpKey($key1, $key2) { 
    if ($key1 == $key2) { 
    return 0; 
    } else { 
    return -1; 
    } 
} 

jedoch zu tun Ich habe keinen Zugriff auf PHP5, also habe ich das nicht getestet.

+0

Das hat bei PHP5 nicht funktioniert. Ich habe eine nicht gültige Rückrufwarnung und ein leeres Array erhalten. – Devon

+0

Es schlägt fehl, weil Sie eine Funktion nicht 0 übergeben müssen. Selbst wenn ich eine Funktion übergebe, die immer wahr oder falsch zurückgibt, bekomme ich immer noch keine gültige Antwort. Sie können Array-Schnittpunkt nicht verwenden, da es ein Array innerhalb eines Arrays ist. Abhängig vom Rückgabetyp können Sie array_walk oder array_map verwenden. – gradbot

2

Ich habe mehr Forschung darüber und fand, dass Rubin und Prototyp beide eine Funktion haben, die dies nennt array_pluck, 2. Es ist interessant, dass array_map eine zweite Verwendung hat, die es Ihnen ermöglicht, das Gegenteil von dem zu tun, was ich hier machen möchte. Ich fand auch eine PHP class jemand schreibt, um Prototypen Manipulation von Arrays zu emulieren.

Ich werde noch etwas herumkramen und wenn ich nichts anderes finde, werde ich an einem Patch arbeiten, um ihn an die mailing-Liste [email protected] zu senden und zu sehen, ob sie array_pluck hinzufügen werden .

7

Ab PHP 5.3, können Sie diesen hübschen Anruf mit Lambda-Funktion verwenden:

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

Dieses Array von 'namen' Dimension geschnitten zurück.

+0

Sie können zusätzlich array_unique für die zurückgegebene Schnittdimension verwenden, um eindeutige Namen zu erhalten. –

0

Sie tun können:

$tmp = array_flip($names); 
$names = array_keys($tmp); 
2

Für diejenigen von Ihnen, die nicht gerade jetzt PHP5.5 aktualisieren können und diese Funktion benötigen, hier ist eine Implementierung von array_column.

function array_column($array, $column){ 
    $a2 = array(); 
    array_map(function ($a1) use ($column, &$a2){ 
     array_push($a2, $a1[$column]); 
    }, $array); 
    return $a2; 
} 
0

Dies ist schnell Funktion Alternative array_column()

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