PHP爆炸和数组索引

时间:2011-01-09 13:14:23

标签: php arrays

如何使以下代码生效?

  

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

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

  

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

4 个答案:

答案 0 :(得分:33)

正如其他人所说,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。您也可以考虑使用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 :(得分:2)

你的第二个代码块是正确的。 explode和其他函数无法返回完全形成的数组以供立即使用,因此您必须设置一个临时变量。开发树中可能有代码可以执行此操作,但获取现在所需元素的唯一方法是临时变量。

答案 2 :(得分:1)

使用current

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

但我觉得很难看

答案 3 :(得分:1)

您可以使用:

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

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

故障:

  • Explode在分隔符上返回一个数组
  • array_slice($arrayname, $offset, $length)为您提供了一个新数组,其中包含来自offset,lenght
  • 的所有项目
  • array_shift($array)为您提供传递给它的数组中的第一个(在本例中是唯一的)项目。

这看起来不太漂亮,但与:

相同
$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

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