2011-01-09 12 views

Respuesta

31

Como han dicho otros, PHP es a diferencia de JavaScript en que no puede acceder a elementos de la matriz de rendimientos de función. El segundo método que enlistó funciona. También puede agarrar el primer elemento de la matriz con los current(), reset(), o array_pop() funciones de este modo:

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

Si desea eliminar la ligera sobrecarga que explote puede causar debido a múltiples separaciones, se puede establecer su límite a 2 pasando dos después de los otros argumentos. También puede considerar usar str_pos y strstr en su lugar:

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

Cualquiera de estas opciones funcionará.

EDIT Otra forma sería usar list() (ver PHP doc). Con él puedes agarrar cualquier elemento:

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

Ese no es tu estilo? Siempre se puede escribir una pequeña función auxiliar para agarrar elementos de funciones que devuelven matrices:

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

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

EDIT: PHP 5.4 será compatible con gran variedad de eliminación de referencias, por lo que será capaz de hacer:

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

pero todo funciona si necesito el primer elemento, no el segundo – kusanagi

+1

ver las ediciones de mi publicación para obtener más información sobre esta y otra forma –

2

Tiene la razón con su segundo bloque de código. explode, y otras funciones no pueden devolver una matriz completamente formada para su uso inmediato, por lo que debe establecer una variable temporal. Puede haber un código en el árbol de desarrollo para hacer eso, pero la única forma de obtener los elementos que necesita por ahora es la variable temporal.

+0

Desafortunadamente es correcto, y eso dice mucho sobre cómo se diseña el lenguaje :-( –

1

uso current

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

pero he encontrado es feo

1

Puede utilizar esto:

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

Esta es la mejor manera que he encontrado para obtener un elemento específico de una matriz de explotar.

Desglose:

  • Explode devuelve una matriz de delimitador
  • array_slice($arrayname, $offset, $length) le da una nueva matriz con todos los elementos de offset, longitud
  • array_shift($array) le da la primera (y en este caso, el único) elemento en la matriz que se le pasó.

Este doesen't parecen bastante, pero hace lo mismo que:

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

Tiene que haber una mejor manera de hacer esto, pero no he encontrado.

Actualizar: estaba investigando esto porque quería para extraer una parte de una dirección URL, así que hice las siguientes pruebas:

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];} 

Los resultados fueron los siguientes:

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 

En mi caso, quería obtener el número 188 de la url, y todo el resto de la url era estático, así que terminé usando el método substr, pero para una versión dinámica donde lenth puede cambiar, el método array_get anterior es los elementos más limpios

Cuestiones relacionadas