2010-03-23 25 views
7

In php come posso accedere ai valori di una matrice senza utilizzare parentesi quadre attorno alla chiave? Il mio problema particolare è che voglio accedere agli elementi di una matrice restituita da una funzione. Say function (args) restituisce un array. Perché è $ var = function (args) [0]; urlando contro le parentesi quadre? Posso fare qualcosa come $ var = function (args) .value (0); o mi manca qualcosa di molto semplice?accesso ai valori degli array senza parentesi quadre in php

+0

php fa riferimento a questo come riferimento all'array di funzioni. È stato incluso in PHP dalla versione 5.4 http://php.net/manual/en/migration54.new-features.php – Steve

risposta

10

Mentre gli altri hanno già detto, è praticamente necessario utilizzare una variabile temporanea:

$temp = myFunction(); 
$value = $temp[0]; 

Ma, se conoscere la struttura della matrice restituita è possibile evitare la variabile temporanea.

Se si desidera solo il primo membro:

$value = reset(myFunction()); 

Se si desidera che l'ultimo membro:

$value = end(myFunction()); 

Se volete uno qualsiasi tra:

// second member 
list(, $value) = myFunction(); 

// third 
list(, , $value) = myFunction(); 

// or if you want more than one: 

list(, , $thirdVar, , $fifth) = myFunction(); 
+0

Ehi, intelligente! 'list()' non smette mai di stupirmi. +1. –

+1

reset() e end() richiedono che gli argomenti siano riferimenti. Ricevi una notifica E_STRICT nelle versioni recenti di php. – goat

+1

sì, lo sto facendo con variabili temporanee, ma mi chiedevo se ne avessi davvero bisogno. ora mi sto solo chiedendo _why_ devo. ma in ogni caso l'uso di list() è abbastanza intelligente. Grazie! – amb

2

In PHP, quando ottiene un array come un risultato della funzione, si deve purtroppo fare un passo in più:

$temp_array = function($args); 
$var = $temp_array[0]; 

Per gli oggetti, questo è stato rilassato in PHP 5. Si può fare:

$echo function($args)->property; 

(fornito function restituisce un oggetto, naturalmente.)

+2

Fa schifo ma questo è l'unico modo per farlo. Uno dei tanti motivi per odiare PHP. –

+0

@Luke vero, ma non * quello * brutto imo. Chissà, potrebbe essere corretto in PHP 7 :) –

+0

@Luke - è un po 'forte no? – nickf

1
function getKey($array, $key){ 
    return $array[$key]; 
} 

$var = getKey(myFunc(args), $key); 

non v'è alcun modo per farlo questo senza aggiungere una funzione utente purtroppo. Non fa parte della sintassi.

Si può sempre farlo solo il vecchio modo di moda

$array = myFunc(); 
$value = $array[0]; 
1

cosa esattamente corrisponde alle vostre aspettative:

echo pos(array_slice($a=myFunc(), pos(array_keys(array_keys($a), 'NameOfKey')); 

risposto Kinetix Kin, Taipei

1

se volete questo, la sua, probabilmente meglio di tornare un oggetto (purtroppo, la sua php totalmente zoppo doesnt sostenere questo). Heres un modo pazzesco ero in grado di capire, però, di novità (per favore non fare questo!):

function returnsArray(){ 
    return array("foo" => "bar"); 
} 

echo json_decode(json_encode((object)returnsArray()))->foo; 
//prints 'bar' 

Così yeah..until aggiungono il supporto per serie dereferencing in php, penso che probabilmente si dovrebbe solo lanciare la matrice di ritorno come un oggetto:

return (object)array("foo" => "bar"); 

e allora si può fare returnsArray() -> foo, dal momento che php rilassa dereferenziazione per gli oggetti, ma non le matrici .. o, naturalmente, scrivere una funzione wrapper come altri hanno suggerito.

+0

, sembra che il supporto per questo sia stato recentemente aggiunto a php? http://wiki.php.net/rfc/functionarraydereferencing – mutexkid

Problemi correlati