Создание массива из предложения

1

У меня есть это предложение из базы данных

0| Future plan 1| Low 2| Normal 3| High 4| Highest

И мне нужно сделать его похожим на:

[0] => Future plan
[1] => Low
[2] => Normal
[3] => High
[4] => Highest

Я не могу найти нить, подобную этому. Помоги пожалуйста.

  • 0
    Это одна строка или?
  • 0
    @Epodax одна строка. :)
Теги:

7 ответов

5
Лучший ответ

Я нашел кое-что, что ДОЛЖНО сделать трюк для вас: 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);
  • 0
    КЛАССНО. спасибо товарищ
2

@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>.

1

попробуй это:

<?php
   $str = "Future plan | Low | Normal | High | Highest";
   print_r (explode("|",$str));
?>
  • 0
    Простое разбиение не будет работать, так как целые числа перед | так что вы получите странно выглядящий массив
1

Учитывая, что в вашей строке у вас есть | , Я сделал следующее (необходимо сделать дополнительные проверки):

$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)
1

Использовать взрыв

$words = preg_replace('/[0-9]+/', '', $string);//remove all numbers from string
$array = explode ("|" , $words);
$array2 = array_filter($array)//remove empty elements
  • 0
    Например, этот Array ( [0] => 0 [1] => Future plan 1 [2] => Low 2 [3] => Normal 3 [4] => High 4 [5] => Highest ) в [0] должен быть план на будущее
  • 0
    Теперь это выглядит как этот Array ( [0] => [1] => Future plan [2] => Low [3] => Normal [4] => High [5] => Highest )
1

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"
// ]
  • 0
    По сложному.
  • 0
    ... но не ломайтесь, если между ними есть числа ... "0 | План будущего 2 | Нормальный 1 | Между 200 и 300 3 | Высокий 4 | Самый высокий". Также фильтрует вывод для пробелов.
Показать ещё 1 комментарий
1

Сначала измените предложение базы данных, а затем в вашем случае используйте функцию php explode ("| ", $string). Эта функция может взорвать строку в массиве с помощью разделителя.

  • 0
    Простое разбиение не будет работать, так как целые числа перед | так что вы получите странно выглядящий массив
  • 1
    Например, этот Array ( [0] => 0 [1] => Future plan 1 [2] => Low 2 [3] => Normal 3 [4] => High 4 [5] => Highest ) в [0] должен быть план на будущее
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню