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;
War es hilfreich?

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:

https://github.com/ramsey/array_column

Ich denke, das tun, was Sie wollen

array_uintersect_uassoc

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;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top