2011-01-09 78 views
17

我怎样才能得到下面的代码工作?PHP爆炸和数组索引

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

我只看到的解决方案看起来像这样:

$ A =爆炸( 'S',$海峡); $ a = $一个[0];

回答

31

正如其他人所说,PHP是不同的JavaScript的,因为它不能访问从函数返回数组元素。 您列出的第二种方法工作。您也可以与current()reset(),或array_pop()功能抢数组的第一个元素,像这样:

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

如果你想删除爆炸可能会导致由于多次分离少量的开销,你可以设置通过在其他论点之后传递2来限制到2。你也可以考虑使用str_pos和strstr代替:

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

任何这些选择都可以。

编辑另一种方法是使用list()(见PHP doc)。有了它,你可以抓住任何元素:

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

那不是你的风格?你总是可以编写一个小的辅助函数来抓住从返回数组的功能要素:

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

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

编辑: PHP 5.4将支持数组语法,所以你将能够做到:

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

,但它一切工作,如果我需要第一个元素,而不是第二个 – kusanagi 2011-01-10 09:00:28

2

你对你的第二个代码块是正确的。 explode和其他函数不能返回一个完全形成的数组立即使用,所以你必须设置一个临时变量。在开发树中可能有代码可以做到这一点,但获取现在需要的元素的唯一方法是临时变量。

+0

这很不幸是正确的,并说了很多关于如何设计语言:-( – 2011-01-09 13:37:10

1

使用current

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

但我发现是丑陋

1

你可以使用这个:

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

这是我发现从爆炸数组中获取特定元素的最佳方法。

击穿:

  • Explode返回的分隔符的数组
  • array_slice($arrayname, $offset, $length)为您提供了从偏移所有项目新阵列,lenght
  • array_shift($array)给你的第一个(在这种情况下,只有)数组传递给它。

这doesen't看起来很漂亮,但不一样的:

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

必须有一个更好的方式来做到这一点,但我还没有找到它。

更新: 我研究这个,因为我想提取URL的一部分,所以我做了以下测试:

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

的结果如下:

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 

在我的情况下,我想从网址获得数字188,并且网址的所有其余部分都是静态的,所以我最终使用substr方法,但对于lenth可能更改的动态版本,上面的array_get方法是紧固件和最干净。