Подтвердить что ты не робот

Как взорвать строку справа налево?

$split_point = ' - ';
$string = 'this is my - string - and more';

Как я могу сделать split, используя второй экземпляр $split_point, а не первый. Могу ли я как-то указать право на поиск? Самый простой подход?

В принципе, как мне взорваться справа налево. Я хочу подобрать последний экземпляр "-".

Результат Мне нужно:

$item[0]='this is my - string'; $item[1]='and more';

и не:

$item[0]='this is my'; $item[1]='string - and more';
4b9b3361

Ответ 1

Вы можете использовать strrev, чтобы отменить строку, а затем отменить результаты:

$split_point = ' - ';
$string = 'this is my - string - and more';

$result = array_map('strrev', explode($split_point, strrev($string)));

Не уверен, что это лучшее решение.

Ответ 2

Как насчет этого:

$parts = explode($split_point, $string);
$last = array_pop($parts);
$item = array(implode($split_point, $parts), $last);

Не собираюсь выигрывать какие-либо награды за гольф, но он показывает намерения и хорошо работает, я думаю.

Ответ 3

Вот еще один способ сделать это:

$split_point = ' - ';
$string = 'this is my - string - and more';

$stringpos = strrpos($string, $split_point, -1);
$finalstr = substr($string,0,$stringpos);

Ответ 4

Если я правильно понял, вы хотите, чтобы случай примера дал вам ( "это моя строка", "и больше" )?

Встроенный split/explode кажется передовым - вам, вероятно, придется реализовать его самостоятельно с помощью strrpos. (поиск влево-вправо)

$idx = strrpos($string, $split_point);
$parts = array(substr($string, 0, $idx), substr($string, $idx+strlen($split_point)))

Ответ 5

Почему бы не разделить на '-', но затем присоединиться к первым двум записям массива, которые вы вернетесь вместе?

Ответ 6

Я наткнулся на то же самое и исправил его так:

$split_point = ' - ';
$string = 'this is my - string - and more';

$reverse_explode = array_reverse(explode($split_point, $string));

Ответ 7

Мне понравился ответ Моффа, но я улучшил его, ограничив количество элементов до 2 и повторно обратив массив:

$split_point = ' - ';
$string = 'this is my - string - and more';

$result = array_reverse(array_map('strrev', explode($split_point, strrev($string),2)));

Тогда $result будет:

Array ( [0] => this is my - string [1] => and more )

Ответ 8

это моя строка - и больше

  • Используйте обычную функцию разрыва, чтобы получить все строки
  • Получить массив sizeof и извлечь последний элемент
  • Выполнить последний элемент, используя функцию array_pop.
  • Импортировать оставшуюся строку с тем же самым делимером (если вы хотите использовать другой делиметр).

код

$arrSpits=explode("", "this is my - string - and more");
$arrSize=count($arrSpits);

echo "Last string".$arrSpits[arrSize-1];//Output: and more


array_pop(arrSpits); //now pop the last element from array

$firstString=implode("-", arrSpits);
echo "First String".firstString; //Output: this is my - string

Ответ 9

Предполагая, что вы хотите, чтобы первое вхождение $split_point игнорировалось, это должно работать на вас:

# retrieve first $split_point position
$first = strpos($string, $split_point);
# retrieve second $split_point positon
$second = strpos($string, $split_point, $first+strlen($split_point));
# extract from the second $split_point onwards (with $split_point)
$substr = substr($string, $second);

# explode $substr, first element should be empty
$array = explode($split_point, $substr);

# set first element as beginning of string to the second $split_point
$array[0] = substr_replace($string, '', strpos($string, $substr));

Это позволит вам разбить на каждое вхождение $split_point после (и включая) второе вхождение $split_point.

Ответ 10

$split_point = ' - ';
$string = 'this is my - string - and more';
$result = end(explode($split_point, $string));

Это нормально работает

Ответ 11

Просто идея:

function explode_reversed($delim,$s){
  $result = array();
  $w = "";
  $l = 0;
  for ($i = strlen($s)-1; $i>=0; $i-- ):
    if ( $s[$i] == "$delim" ):
      $l++;
      $w = "";
    else:
      $w = $s[$i].$w;
    endif;
    $result[$l] = $w;
  endfor;
return $result;
}
$arr = explode_reversed(" ","Hello! My name is John.");
print_r($arr);

Результат:

Array
(
    [0] => John.
    [1] => is
    [2] => name
    [3] => My
    [4] => Hello!
)

Но это намного медленнее, чем взорваться. Тест сделан:

$start_time = microtime(true);
for ($i=0; $i<1000;$i++)   
  $arr = explode_reversed(" ","Hello! My name is John.");
$time_elapsed_secs = microtime(true) - $start_time;
echo "time: $time_elapsed_secs s<br>";

Принимает 0,0625 - 0,078125 с

Но

for ($i=0; $i<1000;$i++)   
  $arr = explode(" ","Hello! My name is John.");

занимает всего 0,015625 с

Почему бы не использовать:

array_reverse(explode($your_delimiter, $your_string));

В цикле 1000 раз это лучшее время, которое я могу получить 0.03125s.