PHP: Exploding array elements
I have a 2D array which I have exploded from a string. Once it has exploded this is what is output:
---> 0 - 16~4~0.0~~~~false~~~~
---> 1 - 1000.0~21.75~L~1~2.0~2.0~L~2~
---> 2 -
---> 0 - 2~5~951.3~6.4~~~false~~~~
---> 1 - 1000.0~11.77~L~1~
---> 2 -
---> 0 - 3~6~1269.02~5.1~~~false~~~~
---> 1 - 5.0~213.66~L~1~4.9~2.56~L~2~4.6~19.5~L~3~
---> 2 - 5.1~53.44~B~1~5.4~8.48~B~2~5.5~15.53~B~3~
I want to make it so that for each position in the array it only takes the first value before the ~. I am unsure how to do this. This is the code I have so far:
$test = explode(":", $string);
foreach($test as &$value) $value = explode('|', $value);
Just in case you need it this is the original string input:
1~1~828.32~12.5~~~false~~~~|1000.0~41.73~L~1~2.0~2.0~L~2~|:4~2~4.16~12.5~~~false~~~~|1000.0~21.75~L~1~2.0~2.0~L~2~|:9~3~0.16~24.0~~~false~~~~|1000.0~21.75~L~1~2.0~2.0~L~2~|:16~开发者_如何学JAVA4~0.0~~~~false~~~~|1000.0~21.75~L~1~2.0~2.0~L~2~|:2~5~951.3~6.4~~~false~~~~|1000.0~11.77~L~1~|:3~6~1269.02~5.1~~~false~~~~|5.0~213.66~L~1~4.9~2.56~L~2~4.6~19.5~L~3~|5.1~53.44~B~1~5.4~8.48~B~2~5.5~15.53~B~3~:8~7~111.92~7.0~~~false~~~~|6.8~6.78~L~1~6.6~148.39~L~2~6.4~3.7~L~3~|7.6~128.0'...
I would like the output to be:
---> 0 - 16
---> 1 - 1000.0
---> 2 -
---> 0 - 2
---> 1 - 1000.0
---> 2 -
---> 0 - 3
---> 1 - 5.0
---> 2 - 5.1
If I understand correctly, you want to take each element of this array and trim off everything after the first ~ character. Building on your code:
$test = explode(":", $string);
foreach($test as &$value)
{
$value = explode('|', $value);
foreach($value as &$inner_value)
{
$inner_value = substr($inner_value, 0, strpos($inner_value, '~'));
}
}
All I added was an inner foreach loop that inspects each value and removes the rest of the string after the ~ character.
Best of coding!
If I understand your question, this should work:
$output = array();
$test = explode(":", $string);
foreach($test as $value) {
$pipes = explode('|',$value);
foreach($pipes as $cur) {
$idx = strpos($cur,'~');
if($idx > -1) {
$output[] = substr($cur,0,$idx);
} else $output[] = '';
}
}
After this is finished executing, $output will contain the desired information. You could also write a recursive function or use a regex, but both those solutions would be a bit more complex.
hth
If you only want to cut out a string part until a delimiter, then use strtok() instead of explode().
I don't quite get your current example. But it might be:
foreach ($test as $i=>$value) {
$test[$i] = strtok($value, '|');
}
You could explode each line by ~ and take the first element.
$test = explode(":", $string);
foreach($test as &$value) {
$value = explode('|', $value);
$result = explode('~', $value);
$first = $result[0];
}
But I think this could become quite inefficient if you only need the first element. A regular expression could be another solution. Like this:
\|(.+?)~
Matching every string after a |
up to the first ~
. This breaks at the beginning of your string, but you could prepend that with a |
for the regex matching.
精彩评论