2010-07-01 1 views
3

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

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

Я получаю это:

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

Я пытаюсь создать массив на основе значений для allowed_values ​​как это:

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

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

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

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

+0

Вам нужно разместить еще один код, с которого вы создаете строку изначально? –

+0

Что вы хотите, чтобы массив выглядел? – Joseph

+0

Вы должны изменить настройку своей базы данных, чтобы сохранить эти настройки в отдельных полях. –

ответ

3

попробовать это:

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

это должно сделать трюк :)

+2

За исключением '(\ w +)' не будет соответствовать «Almost Extinct». Замените это на '([^ \ d] +)', который должен делать трюк, предполагая, что «значения» никогда не будут иметь чисел в них.С фиксированным регулярным выражением этот ответ является лучшим решением, я думаю, потому что он не предполагает, что числа будут отсортированы с самого низкого до самого высокого и слепо нажмите каждое значение в конец массива. – MooGoo

+0

отредактировал ответ, чтобы принять во внимание комментарий – dweeves

+0

Мне нравится Этот метод. – Mike

0

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

<?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" 
} 
2

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

$string = unserialized($r['settings']['allowed_values']); 
//$string = '1|Common 2|Rare 3|Almost Extinct'; 

print_r (preg_split("/\d+\|/", $string, -1, PREG_SPLIT_NO_EMPTY)); 

Выходы:

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

Он отличается от массива вопросом (разные ключи). –

+0

Я просто использовал вывод из 'unserialized ($ r ['settings'] ['allowed_values'])' как содержимое '$ string'. Я уточнил это сейчас. – Mike

0

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

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

Производит:

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

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