Domanda

Supponiamo, ad esempio, di aver appena richiesto un database e di aver ricevuto questo array 2D.

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

Mi trovo spesso a scrivere loop in questo modo.

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

Le mie domande sono: esiste un modo per ottenere questo array $ names senza usare un loop? L'uso delle funzioni di callback conta come l'utilizzo di un loop.

Ecco un esempio più generico di ottenere ogni campo.

foreach($results as $result)
    foreach($result as $key => $value)
        $fields[$key][] = $value;
È stato utile?

Soluzione

A partire dal 20 giugno in PHP-5.5 è disponibile una nuova funzione array_column

Ad esempio:

$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);

Restituirà

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

Ci sono ancora più esempi nel link sopra menzionato.

Altri suggerimenti

Ho votato a favore della risposta di @ Devon perché non c'è davvero modo di fare ciò che stai chiedendo con una funzione integrata. Il meglio che puoi fare è scrivere il tuo:

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

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

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

Questo restituirà un array suddiviso per dimensione 'nome'.

In poche parole, no.

Dovrai utilizzare un loop o una funzione di callback come array_walk .

Ho fatto ulteriori ricerche su questo e ho scoperto che il rubino e il prototipo hanno entrambi una funzione che fa questo chiamato array_pluck , 2 . È interessante che array_map abbia un secondo uso che ti consente di fare l'inverso di quello che voglio fare qui. Ho anche trovato un PHP class che qualcuno sta scrivendo per emulare la manipolazione dei prototipi di array.

Continuerò a scavare un po 'di più e se non trovo nient'altro lavorerò su una patch per inviare alla mailing list internals@lists.php.net e vedere se aggiungeranno array_pluck.

Per quelli di voi che al momento non possono eseguire l'upgrade a PHP5.5 e necessitano di questa funzione, ecco un'implementazione di array_column .

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

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

https://github.com/ramsey/array_column

Penso che questo farà ciò che vuoi

array_uintersect_uassoc

Dovresti fare qualcosa del genere

$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;
  }
}

Tuttavia, non ho accesso a PHP5, quindi non l'ho provato.

Potresti fare:

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

Questa è l'alternativa rapida alle funzioni di array_column ()

if(!function_exists('array_column')) {
    function array_column($element_name) {
        $ele =   array_map(function($element) {
            return $element[$element_name];
        }, $a);
        return  $ele;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top