2016-04-05 4 views
5

Orso con me, sto imparando. Vedo spesso frammenti come quella qui sotto:È possibile ottenere il valore da una matrice senza prima ottenere l'array?

<?p 
$imageArray = get_field('image_field'); 
$imageAlt = $imageArray['alt']; 
$imageURL = $imageArray['url']; 
?> 

È pedagogico e chiaro e organizzato. Ma è necessario ottenere l'intero array prima di interrogare l'array per i valori? Non posso definire la variabile in una sola riga? Qualcosa come il sotto (che non funziona, né le altre varianti che ho provato):

$imageAlt = get_field('image_field', ['alt']); 
$imageURL = get_field('image_field', ['url']); 

risposta

6

La questione si sta chiedendo si può rispondere chiedendo 2 domande:

  1. E 'fattibile?
  2. È una buona idea farlo in questo modo?

È fattibile?

Sì! Non è necessario memorizzare la matrice in una variabile e riutilizzarla in un secondo momento.

Per esempio, si potrebbe fare:

$imageAlt = get_field('image_field')['alt']; 

Nota: Questo funziona in PHP 5.4+ e si chiama: Array dereferencing.

Ma questa non è l'unica considerazione ...

E 'una buona idea per farlo in quel modo?

No. In molti casi non è una buona idea. La funzione get_field(), a seconda del contesto, è probabilmente che fa molto lavoro e, ogni volta che lo chiami, lo stesso lavoro viene donato più volte.

Supponiamo di utilizzare la funzione count(). Conta il numero di elementi in un array. Per fare ciò, deve scorrere tutti gli oggetti per ottenere il valore.

Se si utilizza la funzione count() ogni volta che è necessario convalidare il numero di elementi in un array, si sta eseguendo il conteggio di ogni volta. Se hai 10 articoli nel tuo array, probabilmente non te ne accorgi. Ma se hai migliaia di elementi nel tuo array, questo potrebbe causare un problema di delay per calcolare il tuo codice (a.k.a. sarà lento).

Ecco perché vorresti fare qualcosa del tipo: $count = count($myArray); e utilizzare una variabile anziché chiamare la funzione.

Lo stesso vale per la tua domanda.

7

Sì, è possibile.

A partire da PHP 5.4 è possibile schierare in dereferenziazione il risultato di una funzione o di una chiamata di metodo direttamente. Prima era possibile solo usando una variabile temporanea. - Source

$imageAlt = get_field('image_field')['alt'];

https://eval.in/548036

0

PHP ti permette di giocare in giro un bel po ':

function foo(){ 
    return array('foo' => 1, 'bar' => 2); 
    } 

Opzione 1

echo foo()['foo']; // 1 

    # Better do this if you plan to reuse the array value. 
    echo ($tmp = foo())['foo']; // 1 
    echo $tmp['bar']; // 2 

Non è consigliabile chiamare una funzione che restituisce un array, per recuperare in modo specifico la chiave e sulla riga successiva facendo la stessa cosa. Quindi è meglio memorizzare il risultato della funzione in una variabile in modo da poterlo usare in seguito.

Opzione 2

list($foo, $bar) = array_values(foo()); 
    #foo is the first element of the array, and sets in $foo. 
    #bar is the second element, and will be set in $bar. 
    #This behavior is in PHP 7, previously it was ordered from right to left. 
    echo $foo, $bar; // 12 

Opzione 3

extract(foo()); // Creates variable from the array keys. 
    echo $foo, $bar; 

    extract(get_field('image_field')); 
    echo $alt, $url; 

Trova maggiori informazioni sulla list costruttore e extract la funzione.

+0

Vuoi dire '$ alt = ($ f = get_field ('image_field'));'? –

+0

@ ʰᵈˑ No, non l'ho fatto. Mentre ho aggiornato il codice ora, il risultato del tuo codice è che '$ alt' ha lo stesso valore di' $ f', mentre '$ alt = ($ f = get_field ('image_field')) ['alt']; 'imposta correttamente' $ alt' sulla chiave dell'array restituito dove '$ f' è il risultato della funzione. – Xorifelse

+0

Ahhh sì, ho letto erroneamente –

2

Mentre PHP 5.4+ consente di direttamente dereference un valore di ritorno della funzione come questa:

get_field('image_field')['alt'] 

... in questo caso particolare io non suggerisco di farlo, dal momento che si sta utilizzando due valori dall'array risultante. Una chiamata di funzione ha un certo overhead di per sé, e inoltre non si sa cosa fa la funzione dietro le quinte prima che restituisca un risultato. Se si chiama la funzione due volte, è possibile che incorre in una quantità di lavoro non necessario, dove una singola chiamata di funzione avrebbe funzionato altrettanto bene.

Questo per non parlare del mantenimento del codice DRY; se hai bisogno di cambiare i dettagli della chiamata di funzione, ora devi cambiarla due volte ...