У меня есть это предложение из базы данных
0| Future plan 1| Low 2| Normal 3| High 4| Highest
И мне нужно сделать его похожим на:
[0] => Future plan
[1] => Low
[2] => Normal
[3] => High
[4] => Highest
Я не могу найти нить, подобную этому. Помоги пожалуйста.
Я нашел кое-что, что ДОЛЖНО сделать трюк для вас: preg_split
$string = "0| Future plan 1| Low 2| Normal 3| High 4| Highest";
$array = preg_split("/[0-9]+\|/", $string, -1, PREG_SPLIT_NO_EMPTY);
@ankhzet указал на недостаток, который охватывает этот ответ.
<?php
$v = '0| Future plan 22 2| Normal 123| Low 3| High 4| Highest';
$arraySplit = preg_split("/([0-9]+)\|/", $v, -1, PREG_SPLIT_DELIM_CAPTURE);
$arrayResult = array();
for($i = 1; $i < count($arraySplit); $i+=2){
$arrayResult[$arraySplit[$i]] = $arraySplit[$i+1];
}
pre($arrayResult);
?>
Новый выход:
Array
(
[0] => Future plan 22
[2] => Normal
[123] => Low
[3] => High
[4] => Highest
)
OLD
Этот метод будет поддерживать идентификатор и короче ответа @ankhzet. Здесь, если вам это нужно:
preg_match_all("/(\d+)\|([^0-9]+)/", $v, $array);
$array = array_combine($array[1], $array[2]);
pre($array);
Результат выглядит следующим образом:
Array
(
[0] => Future plan
[2] => Normal
[1] => Low
[3] => High
[4] => Highest
)
FYI, pre()
- это просто функция wraps print_r()
внутри тегов <pre></pre>
.
попробуй это:
<?php
$str = "Future plan | Low | Normal | High | Highest";
print_r (explode("|",$str));
?>
Учитывая, что в вашей строке у вас есть |
, Я сделал следующее (необходимо сделать дополнительные проверки):
$string = '0| Future plan 1| Low 2| Normal 3| High 4| Highest';
$string = str_replace('|','',$string); //replace |
$length = strlen($string); //get length
for($i=0; $i<=$length-1;$i++)
{
if(is_numeric($string[$i])) { //get numbers
$word[$string[$i]] ='';
$lastIndex = $string[$i]; //save last found
} else {
if($string[$i]!=' ') { //if not space append to array element of last number found
$word[$lastIndex] .= $string[$i];
}
}
}
var_dump($word);
array (size=5)
0 => string 'Futureplan' (length=10)
1 => string 'Low' (length=3)
2 => string 'Normal' (length=6)
3 => string 'High' (length=4)
4 => string 'Highest' (length=7)
Использовать взрыв
$words = preg_replace('/[0-9]+/', '', $string);//remove all numbers from string
$array = explode ("|" , $words);
$array2 = array_filter($array)//remove empty elements
Array ( [0] => 0 [1] => Future plan 1 [2] => Low 2 [3] => Normal 3 [4] => High 4 [5] => Highest )
в [0] должен быть план на будущее
Array ( [0] => [1] => Future plan [2] => Low [3] => Normal [4] => High [5] => Highest )
REGEXP, предложенный @Epodax, не будет содержать индексы:
$v = '0| Future plan 2| Normal 1| Low 3| High 4| Highest';
$array = preg_split("/[0-9]+\|/", $v, -1, PREG_SPLIT_NO_EMPTY);
dump($array);
// array:5 [▼
// 0 => " Future plan "
// 1 => " Normal "
// 2 => " Low "
// 3 => " High "
// 4 => " Highest"
// ]
Если это имеет значение, вероятно, лучше использовать это:
$v = '0| Future plan 2| Normal 1| Low 3| High 4| Highest';
$v .= '0|';
$r = [];
while ($v) {
if (!preg_match('/(\d+)\|(.+?)(?:(\d+)\|)/', $v, $m, PREG_OFFSET_CAPTURE))
break;
$idx = intval($m[1][0]);
$r[$idx] = trim($m[2][0]);
if (($offset = $m[3][1]) >= strlen($v))
break;
$v = substr($v, $offset);
}
dump($r);
// array:5 [▼
// 0 => "Future plan"
// 2 => "Normal"
// 1 => "Low"
// 3 => "High"
// 4 => "Highest"
// ]
Сначала измените предложение базы данных, а затем в вашем случае используйте функцию php explode ("| ", $string)
. Эта функция может взорвать строку в массиве с помощью разделителя.
Array ( [0] => 0 [1] => Future plan 1 [2] => Low 2 [3] => Normal 3 [4] => High 4 [5] => Highest )
в [0] должен быть план на будущее