PHP 分割字符串和数组索引

21
我该如何让以下代码正常工作? $a = explode('s', $str)[0];
我只看到像这样的解决方案: $a = explode('s', $str); $a=$a[0];
4个回答

34

正如其他人所说,与JavaScript不同的是,PHP无法从函数返回值中访问数组元素。

你列出的第二种方法是有效的。你还可以使用current()reset()或者array_pop()函数来获取数组的第一个元素,例如:

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

如果您想要消除由于多个分离引起的 explode 轻微开销,可以通过在其他参数后传递两个来将其限制为 2。 您还可以考虑改用 str_pos 和 strstr:

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

这些选择都可以使用。

编辑 另一种方法是使用 list()(请参见PHP文档)。使用它可以获取任何元素:

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

2

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


很不幸,这说明了语言设计的很多问题 :-( - Déjà vu

1

使用 current

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

但我发现它很丑陋


1

您可以使用这个:

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

这是我发现的从explode中获取特定元素的最佳方法。

分解:

  • Explode在分隔符上返回一个数组
  • array_slice($arrayname, $offset, $length)给你一个新的数组,其中包含从偏移量开始的所有项目,长度为length
  • 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方法,但对于长度可能会改变的动态版本,上面的array_get方法是最快和最干净的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接