Schneiden eines multidimensionalen PHP-Array über eines seiner Bestandteile
-
03-07-2019 - |
Frage
Nehmen wir zum Beispiel einfach in eine Datenbank abgefragt und Sie empfangen dieses 2D-Array.
$results = array(
array('id' => 1, 'name' => 'red' , 'spin' => 1),
array('id' => 2, 'name' => 'green', 'spin' => -1),
array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);
Ich finde ich oft Schleifen wie diese zu schreiben.
foreach($results as $result)
$names[] = $result['name'];
Meine Fragen sind Gibt es eine Möglichkeit, diesen Array $ Namen zu erhalten, ohne eine Schleife? Mit Callback-Funktionen zählen eine Schleife verwendet wird.
Hier ist ein allgemeines Beispiel für jedes Feld zu bekommen.
foreach($results as $result)
foreach($result as $key => $value)
$fields[$key][] = $value;
Lösung
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);
Wir kommen wieder
Array
(
[0] => John
[1] => Sally
[2] => Jane
[3] => Peter
)
Es gibt noch mehr Beispiele in dem oben genannten Link.
Andere Tipps
gestimmt I @ Devon Antwort, weil es wirklich keine Möglichkeit zu tun, was Sie mit einer eingebauten Funktion sind gefragt. 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;
}
Ab PHP 5.3, können Sie diesen hübschen Anruf mit Lambda-Funktion verwenden:
$names = array_map(function ($v){ return $v['name']; }, $results);
Dies wird Array zurück mit 'name' Dimension in Scheiben geschnitten.
Einfach gesagt, nein.
Sie müssen eine Schleife oder eine Rückruffunktion wie array_walk verwenden.
ich auf diesem mehr Forschung getan und festgestellt, dass Rubin und Prototyp sowohl eine Funktion haben, die diese aufgerufen hat array_pluck , 2 . Es ist interessant, dass array_map
eine zweite Anwendung, die Ihnen die Inverse erlaubt, zu tun, was ich will hier tun. Ich fand auch eine PHP Klasse jemand schreibt Prototypen Manipulation von Arrays zu emulieren.
Ich werde einige weitere Graben um zu tun, und wenn ich werde ich an einem Patch arbeiten nicht etwas anderes finden, um die internals@lists.php.net Mailingliste einreichen und sehen, ob sie array_pluck hinzufügen.
Für diejenigen von Ihnen, die nicht aktualisieren können jetzt auf PHP5.5
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;
}
Wenn Sie eine Version von PHP vor 5.5 und array_column()
laufen, können Sie den offiziellen Austausch im Klar PHP verwenden können:
Ich denke, das tun, was Sie wollen
Sie müßten so etwas tun
$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;
}
}
Allerdings habe ich keinen Zugriff auf PHP5 haben, damit ich nicht getestet haben.
Sie können tun:
$tmp = array_flip($names);
$names = array_keys($tmp);
Das 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;
}
}