Вопрос PHP - Как создать массив из строки? - PullRequest
3 голосов
/ 01 июля 2010

В моей базе данных некоторые настройки полей сериализуются и сохраняются. Когда я делаю это:

print_r(unserialized($r['settings']));

Я получу это:

Array ( 
[prefix] => 
[suffix] => 
[min] => 
[max] => 
[allowed_values] => 1|Common 2|Rare 3|Almost Extinct 
)

Я пытаюсь создать массив на основе значений для allow_values, например:

Array (
[1] => Common
[2] => Rare
[3] => Almost Extinct
)

Проблема в том, что когда я использую explode ("|", $ r ['позволено_значения']), я получаю:

Array(
[0] => 1
[1] => Common 2
[2] => Rare 3
[3] => Almost Extinct
)

Что, имеет смысл, но, очевидно, не то, на что я надеялся ... Итак, мне просто интересно, есть ли простой способ сделать то, что я пытаюсь здесь? Я думал об использовании многократного разнесения, один раз для пробелов и один раз для каналов, но это также не сработает из-за пробела в «Почти вымершем» ...

Ответы [ 4 ]

3 голосов
/ 01 июля 2010

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

 $tab=array();
 preg_match_all("/\s*(\d+)\|([^\d]+)/",$r['allowed_values'],$tab);
 print_r(array_combine($tab[1],$tab[2]));

это должно сработать :)

2 голосов
/ 01 июля 2010

Если исходные индексы не являются последовательными от 1, и вам нужно сохранить их такими, как они есть, см. Ответ dweeves, так как при этом индексы и значения связаны друг с другом правильно.1004 *

Array
(
    [0] => Common 
    [1] => Rare 
    [2] => Almost Extinct
)
0 голосов
/ 01 июля 2010

Я бы использовал регулярное выражение, чтобы соответствовать шаблону каждой записи, но захватывал только интересующий текст.Используя preg_match_all(...), объект $match заполняется вложенными массивами групп захвата.

$input = '1|Common 2|Rare 3|Almost Extinct';
preg_match_all('/\d+\|([^\d]+)/',$input, $match);
print_r($match[1]);

Производит:

Array
(
    [0] => Common 
    [1] => Rare 
    [2] => Almost Extinct    
)

Обратите внимание, что есливаши ярлыки будут использовать числа, вам нужно настроить регулярное выражение.

Этот метод также позволяет вам захватывать число и создавать собственный упорядоченный массив, если значения, хранящиеся в ваших таблицах, могут быть внезаказ.

0 голосов
/ 01 июля 2010

Я думаю, что это должно работать.Это разбивает первый номер и "|"char

<?php
$string = "1|Faruk 2|Test";
$array = preg_split('/\d/', $string, -1, PREG_SPLIT_NO_EMPTY); 
$content = explode("|", implode($array));

var_dump($content);
?>

А вот и результат

array(3) {
  [0]=>
  string(0) ""
  [1]=>
  string(6) "Faruk "
  [2]=>
  string(4) "Test"
}
...