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];
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];
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];
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.
Questo è purtroppo corrette, e questo la dice lunga su come il linguaggio è stato progettato :-( –
È 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 delimitatorearray_slice($arrayname, $offset, $length)
ti dà un nuovo array con i lotti di offset, lunghezzaarray_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.
ma tutto funziona se ho bisogno primo elemento, non secondo – kusanagi
vedere le modifiche del mio post per maggiori informazioni su questo e un altro modo –