Инфраструктура PHP и индекс массива

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

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

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

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

Как говорили другие, 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. 

РЕДАКТИРОВАТЬ: PHP 5.4 будет поддерживать разыменование разметки, поэтому вы сможете:

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

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

использовать current

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

но я нашел уродливый

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

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

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

Сломать:

  • Explode возвращает массив на разделителе
  • array_slice($arrayname, $offset, $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 

В моем случае я хотел получить номер 188 из URL-адреса, а весь остальной URL-адрес был статичным, поэтому я закончил использование метода substr, но для динамической версии, где lenth может измениться, описанный выше метод array_get является быстрым и самый чистый.