2011-01-09 77 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方法是緊固件和最乾淨。