PHP分解和数组索引

PHP分解和数组索引,php,arrays,Php,Arrays,如何使以下代码正常工作 $a=爆炸('s',$str)[0] 我只看到这样的解决方案: $a=爆炸('s',$str)$a=$a[0] 您的第二个代码块是正确的分解,其他函数无法返回完全格式的数组供立即使用,因此必须设置临时变量。开发树中可能有这样做的代码,但是现在获取所需元素的唯一方法是临时变量。使用 但我发现它很难看正如其他人所说,PHP与JavaScript不同,它不能从函数返回中访问数组元素。 您列出的第二种方法有效。您还可以使用current()、reset()或array\u pop

如何使以下代码正常工作

$a=爆炸('s',$str)[0]

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

$a=爆炸('s',$str)$a=$a[0]


您的第二个代码块是正确的<代码>分解,其他函数无法返回完全格式的数组供立即使用,因此必须设置临时变量。开发树中可能有这样做的代码,但是现在获取所需元素的唯一方法是临时变量。

使用


但我发现它很难看

正如其他人所说,PHP与JavaScript不同,它不能从函数返回中访问数组元素。 您列出的第二种方法有效。您还可以使用
current()
reset()
array\u pop()
函数获取数组的第一个元素,如下所示:

$a = current( explode( 's', $str ) ); //or
$a = reset( explode( 's', $str ) ); //or
$a = array_pop ( explode( 's', $str ) );
如果您想消除由于多次分隔而可能导致的轻微开销,可以通过在其他参数之后传递两个参数,将其限制设置为2。您也可以考虑使用StruPOS和STRSTR代替:

$a = substr( $str, 0, strpos( $str, 's' ) );
这些选择中的任何一个都会起作用

另一种编辑方法是使用
list()
(请参阅)。使用它,您可以抓取任何元素:

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.
编辑:PHP5.4将支持数组解引用,因此您可以执行以下操作:

$first_element = explode(',','A,B,C')[0];
您可以使用以下选项:

$a = array_shift(array_slice(explode("s", $str), 0, 1)));
这是我发现的从explode的数组中获取特定元素的最佳方法

细分:

  • Explode
    返回分隔符上的数组
  • array\u slice($arrayname,$offset,$length)
    为您提供一个新数组,其中包含offset,lenght中的所有项
  • array\u 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];}

在我的例子中,我想从url中获取数字188,而url的所有其余部分都是静态的,因此我最终使用了substr方法,但对于lenth可能发生变化的动态版本,上面的array_get方法是最快、最干净的。

不幸的是,这是正确的,这说明了语言是如何设计的:-(
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