Как взорвать строку справа налево?
$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';
Ответы
Ответ 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.