2013-03-11 12 views
6

Secondo https://wiki.php.net/rfc/array_column array_column è previsto l'aggiunta a PHP al più presto. Ma ho difficoltà a capire la RFC. Cosa verrà restituito se una chiave con nome non esiste?Cosa restituirà array_column se un nome chiave non esiste?

Esempio:

$arr = array(
    array(
     'firstname' => 'Bob', 
     'lastname' => 'Tomato' 
    ), 
    array(
     'firstname' => 'Larry', 
     'lastname' => 'Cucumber' 
    ) 
); 

$middlenames = array_column($arr, 'middlename'); 
+2

Link o non è successo. –

+1

cos'è questa funzione array_column? –

+0

https://wiki.php.net/rfc/array_column –

risposta

5

Secondo: https://wiki.php.net/rfc/array_column

Quando un corrispondente indexKey non può essere trovato, il valore viene calettato con un numero intero, partendo da zero.

Esempio utilizzato in RFC:

$mismatchedColumns = array(
    array(
     'a' => 'foo', 
     'b' => 'bar', 
     'e' => 'baz' 
    ), 
    array(
     'a' => 'qux', 
     'c' => 'quux', 
     'd' => 'corge' 
    ), 
    array(
     'a' => 'grault', 
     'b' => 'garply', 
     'e' => 'waldo' 
    ), 
); 

$foo = array_column($mismatchedColumns, 'a', 'b'); 

Risultati in $foo pari a:

Array 
(
    [bar] => foo 
    [0] => qux 
    [garply] => grault 
) 

In sostanza, il valore a un diventa il nuovo valore di matrice, e b diventa il tasto. Quando l'array originale non contiene la chiave b, crea un indice 0 e lo utilizza. Se ci fossero più chiavi che non esistevano, sarebbero incrementali da 0.

Guardando nei loro esempi un po 'oltre, si suggerisce che quando non si riesce a far corrispondere un valore nell'array originale, non si ottenere un elemento di matrice a tutti. Questo significa che se stavi cercando un singolo valore in un array e non esistesse, restituirebbe un array vuoto.


P.S. Ovviamente non ho mai usato questa funzione, quindi la maggior parte di questa è l'interpretazione della RFC.


Su un lato nota, questa funzione è stato accettato per l'inclusione in PHP ed è stato originariamente proposto da Ben Ramsey con un risultato finale dal voto di 38 a favore e 6 contrari. La discussione sulla mailing list può essere vista qui: http://grokbase.com/t/php/php-internals/126nxxa80p/draft-rfc-array-column-function. Vedi anche https://github.com/php/php-src/pull/257

+2

Non sto seguendo. Puoi fare un esempio? – Isius

+2

Il tuo esempio non è esattamente lo stesso degli OP. –

+0

@RocketHazmat: Ho rimosso la parte in cui mostrava come appariva una matrice simile se inizializzata come tale. –

7

Introduzione

per voi di capire il RFC è necessario capire il problema prima e la ragione è stato introdotto.

l'array

$arr = array(
     array(
       'firstname' => 'Bob', <-- 
       'lastname' => 'Tomato'  | <-- 
     ),         |  | 
     array(       |  | 
       'firstname' => 'Larry', <--  | 
       'lastname' => 'Cucumber'  <-| 
     ) 
); 

Ottenere Colonna

Per ottenere Bob & Larry o Tomato and Cucumber hai utilizzare più di una riga di esempi di codice sono:

$colums = array(); 
foreach (array_map(null, $arr[0], $arr[1]) as $value) { 
    $colums[] = $value; 
} 
print_r($colums); 

Output

Array 
(
    [0] => Array 
     (
      [0] => Bob 
      [1] => Larry 
     ) 

    [1] => Array 
     (
      [0] => Tomato 
      [1] => Cucumber 
     ) 

) 

dinamica Versione

Il codice di cui sopra potrebbe funzionare solo se si conosce il numero di elementi in un altro modo creativo sarebbe

$colums = array(); 
array_unshift($arr, null); 
foreach (call_user_func_array("array_map", $arr) as $value) { 
    $colums[] = $value; 
} 

Live Test

or Better Sill utilizzare MultipleIterator

$mi = new MultipleIterator(MultipleIterator::MIT_NEED_ALL); 
foreach ($arr as $v) { 
    $mi->attachIterator(new ArrayIterator($v)); 
} 

$colums = array(); 
foreach ($mi as $v) { 
    $colums[] = $v; 
} 
print_r($colums); 

Live Test

Nome chiave

Se avete bisogno di ottenere il nome della chiave qui è un altro metodo

$colums = array_reduce($arr, function ($a, $b) { 
    foreach ($b as $k => $v) { 
     $a[$k][] = $v; 
    } 
    return $a; 
}); 

Live Test

Torna array_column

array_column intende semplicemente il processo e ottenere tutte le colonne con il primo nome sarebbe stato semplice come il seguente:

print_r(array_column($arr,"lastname")); 
          ^
           | 
           +--- This get value with key "lastname" 

Live Test

più complessa Senerio

Immaginate di voler l'array avere questa uscita

Array 
(
    [Bob] => Tomato 
    [Larry] => Cucumber 
) 

usare i vecchi metodi che è possibile avere

$colums = array(); 
array_unshift($arr, null); 
foreach (call_user_func_array("array_map", $arr) as $value) { 
    $key = array_shift($value); 
    $colums[$key] = current($value); 
} 
print_r($colums); 

Live Test

Ora potete vedere ho dovuto usare array_shift e current per arrivare primo elemento 2 ..come l'array cresce questo può diventare complessa ma array_column semplificherebbe questo

print_r(array_column($arr,"lastname","firstname")); 
          ^  ^
           |   | 
          Value  Key (I wonder why position is backwards) 

Output

Array 
(
    [Bob] => Tomato 
    [Larry] => Cucumber 
) 

infine tornare alla tua domanda

What will be returned if a named key doesn't exist?

Array vuoto ... Da il tuo esempio

print_r(array_column($arr,"middlename")); 
           ^
           | 
         it would try to check if any of your array has key middle man 

It returns

Array  <------- Otherwise returns empty array 
(
) 

Conclusione

ho usato in modo possono esempi diversi che utilizzano loop, array_map, array_reduce e MultipleIterator per spiegare cosa array_column sta cercando di raggiungere.

Come si può vedere array_column è molto più semplificato ma i would advice you play with the examples in the RFC un po 'e questo permetterebbe di capire meglio se ancora non lo capisco, PHP è un linguaggio flessibile, si può sempre implementare la propria versione

Problemi correlati