views:

876

answers:

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

How can i make a split using the second instance of $split_point and not the first one. Can I specify somehow a right to left search? Best simple approach?

Basically how do I explode from Right to Left. I want to pick up the last instance of " - ".

Result I need:

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

and not:

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

If I understand correctly, you want the example case to give you ('this is my - string', 'and more')?

Built-in split/explode seems to be forwards-only - you'll probably have to implement it yourself with strrpos. (right-left search)

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

You may use strrev to reverse the string, and then reverse the results back:

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

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

Not sure if this is the best solution though.

moff
Creative! solution!
Evert
Sounds great,., Wow... I'll try now and see.
Codex73
Why use split and not explode? Any difference?
Codex73
Oops, I thought I was coding in JavaScript there, I've now corrected it.
moff
How do I reverse it again?
Codex73
I mean reverse the array.
Codex73
dont quite also get the array_map usage
Codex73
array_map runs strrev over every element in the array, and returns the result. You may also try something like this, which may be simpler:$result = array_reverse(explode($split_point, $string));
moff
+2  A: 

Why not split on ' - ', but then join the first two array entries that you get back together?

Alister Bulman
sounds interesting.
Codex73
but i need to split on the last instance always of -.
Codex73
+1, the easiest way
SilentGhost
if it is always going to be the last instance, you can find the last match with http://php.net/strrpos, then that whichever side you want to/from that position with substr
Alister Bulman
+2  A: 

How about this:

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

Not going to win any golf awards, but it shows intent and works well, I think.

Paolo Bergantino
A: 

Assuming you only want the first occurrence of $split_point to be ignored, this should work for you:

# 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));

This will allow you to split on every occurrence of $split_point after (and including) the second occurrence of $split_point.

quaff