2011-01-09 15 views
17

Come posso far funzionare il seguente codice?PHP explode e array index

$ a = esplode ('s', $ str) [0];

vedo solo soluzioni simile a questo:

$ a = explode ('s', $ str); $ A = $ a [0];

risposta

31

Come altri hanno detto, PHP è a differenza di JavaScript nel senso che non può accedere elementi di un array da funzione ritorna. Il secondo metodo che hai elencato funziona. È anche possibile prendere il primo elemento della matrice con i current(), reset() o array_pop() funzioni in questo modo:

$a = current(explode('s', $str)); //or 
$a = reset(explode('s', $str)); //or 
$a = array_pop (explode('s', $str)); 

Se si desidera rimuovere il piccolo sovraccarico che esplodono può causare a causa di molteplici separazioni, è possibile impostare il suo limite a 2 passando due dopo gli altri argomenti. Puoi anche prendere in considerazione l'utilizzo di str_pos e strstr invece:

$a = substr($str, 0, strpos($str, 's')); 

Ognuna di queste scelte funzionerà.

MODIFICA Un altro modo è utilizzare list() (vedere PHP doc). Con esso è possibile afferrare qualsiasi elemento:

list($first) = explode('s', $str); //First 
list(,$second) = explode('s', $str); //Second 
list(,,$third) = explode('s', $str); //Third 
//etc. 

Che non è il tuo stile? È sempre possibile scrivere una piccola funzione di supporto per afferrare gli elementi da funzioni che restituiscono le matrici:

function array_grab($arr, $key) { return($arr[$key]); } 

$part = array_grab(explode('s', $str), 0); //Usage: 1st element, etc. 

EDIT: PHP 5.4 supporterà serie dereferenziazione, in modo da essere in grado di fare:

$first_element = explode(',','A,B,C')[0]; 
+1

ma tutto funziona se ho bisogno primo elemento, non secondo – kusanagi

+1

vedere le modifiche del mio post per maggiori informazioni su questo e un altro modo –

2

Sei corretto con il tuo secondo blocco di codice. explode e altre funzioni non possono restituire un array completamente formato per l'utilizzo immediato e pertanto è necessario impostare una variabile temporanea. Ci può essere del codice nell'albero di sviluppo per farlo, ma l'unico modo per ottenere gli elementi di cui hai bisogno per ora, è la variabile temporanea.

+0

Questo è purtroppo corrette, e questo la dice lunga su come il linguaggio è stato progettato :-( –

1

uso current

$a = current(explode('s', $str)); 

ma ho trovato è brutto

1

È possibile utilizzare questo:

$a = array_shift(array_slice(explode("s", $str), 0, 1))); 

questo è il modo migliore che ho trovato per ottenere uno specifico elemento da un array da esplodere.

Ripartizione:

  • Explode restituisce un array sul delimitatore
  • array_slice($arrayname, $offset, $length) ti dà un nuovo array con i lotti di offset, lunghezza
  • array_shift($array) ti dà il primo (ed in questo caso, l'unica) l'elemento nella matrice è passato a esso.

Questo doesen't guardare piuttosto, ma fa lo stesso:

$a = explode('s', $str)[0]; 

Ci deve essere un modo migliore per fare questo, ma non l'ho trovato.

Aggiornamento: mi stava indagando questo perché volevo estrarre una porzione di un URL, così ho fatto le seguenti prove:

function urlsplitTest() 
{ 

    $url = 'control_panel/deliveryaddress/188/edit/'; 
    $passes = 1000000; 

    Timer::reset(); 
    Timer::start(); 
    $x =0; 
    while ($x<$passes) { 
     $res = array_shift(array_slice(explode("/", $url), 2, 1)); 
     $x++; 
    } 
    Timer::stop(); 
    $time = Timer::get(); 
    echo $res.'<br />Time used on: array_shift(array_slice(explode("/", $url), 2,  1)):'.$time; 

    Timer::reset(); 
    Timer::start(); 
    $x =0; 
    while ($x<$passes) { 
     $res = array_get(explode("/", $url), 2); 
     $x++; 
    } 
    Timer::stop(); 
    $time = Timer::get(); 
    echo $res.'<br />Time used on: array_get(explode("/", $url), 2): '.$time; 

    Timer::reset(); 
    Timer::start(); 
    $x =0; 
    while ($x<$passes) { 
     $res = substr($url, 30, -6); 
     $x++; 
    } 
    Timer::stop(); 
    $time = Timer::get(); 
    echo $res.'<br />Time used on: substr($url, 30, -6): '.$time; 
} 

function array_get($array, $pos) {return $array[$pos];} 

I risultati sono stati i seguenti:

Time used on: array_shift(array_slice(explode("/", $url), 2, 1)):7.897379 
Time used on: array_get(explode("/", $url), 2): 2.979483 
Time used on: substr($url, 30, -6): 0.932806 

Nel mio caso volevo ottenere il numero 188 dall'url, e tutto il resto dell'URL era statico, quindi ho finito col usare il metodo substr, ma per una versione dinamica dove lenth potrebbe cambiare, il metodo array_get sopra è i collegamenti e più puliti.