2011-01-09 5 views
17

Как я могу получить следующий код для работы?PHP explode and array index

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

Я вижу только решения вида:

$ а = взрываются ('s', $ строка); $ А = $ а [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, передавая два после других аргументов. Вы также можете использовать str_pos и strstr вместо:

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

Любой из этих вариантов будет работать.

EDIT Другой способ - использовать 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. 

EDIT: PHP 5.4 будет поддерживать массив разыменования, так что вы сможете сделать:

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

, но все это работает, если мне нужен первый элемент, а не второй – kusanagi

+1

см. Правки моего сообщения для получения дополнительной информации об этом и другом способе –

2

Вы верны ко второму блоку кода. explode и другие функции не могут вернуть полностью сформированный массив для немедленного использования, поэтому вам нужно установить временную переменную. Для этого может быть код в дереве разработки, но единственный способ получить нужные вам элементы - временная.

+0

Это, к сожалению, правильно, и это говорит о том, как язык разработан :-( –

1

использование current

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

, но я нашел это некрасиво

1

Вы можете использовать это:

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

Это лучший способ, которым я нашел, чтобы получить определенный элемент из массива от взрыва.

Разбивка:

  • Explode возвращает массив на разделителе
  • array_slice($arrayname, $offset, $length) дает вам новый массив со всеми элементами офсетных, длиной
  • array_shift($array) дает вам первое (и в этом случае, только) в массиве, переданном ему.

Это doesen't выглядеть красиво, но делает то же самое, как:

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

Там должен быть лучший способ сделать это, но я не нашел его.

Update: Я расследовал это, потому что я хотел, чтобы извлечь часть в 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 из URL-адреса, а весь остальной URL был статичным, поэтому я закончил использование метода substr, но для динамической версии, где lenth может измениться, метод array_get выше является быстрым и чистым.