2010-07-01 99 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

你需要发布更多的代码,你最初创建的字符串是谁? – 2010-07-01 15:30:51

+0

你想让数组看起来像什么? – Joseph 2010-07-01 15:47:54

+0

您必须更改数据库的设置,以将这些设置存储在不同的字段中 – 2010-07-01 16:02:06

回答

3

试试这个:

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

这应该使的伎俩:)

+2

除((w +))不匹配'几乎灭绝'外。用'([^ \ d] +)替代'假设“值”永远不会有数字。使用固定的正则表达式,这个答案是我认为的最好的解决方案,因为它不会假设数字将从最低到最高排序,并且将每个值盲目推送到数组的末尾 – MooGoo 2010-07-01 15:56:41

+0

编辑了回复,以便对帐户进行评论 – dweeves 2010-07-01 16:33:15

+0

我喜欢这种方法。 – Mike 2010-07-01 17:16:27

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顺序,你需要保持它们原样,看到d​​weeves的答案,因为这样可以将索引和值绑定在一起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

它看起来不同于问题的数组(不同的键)。 – 2010-07-01 16:02:26

+0

我刚刚使用'unserialized($ r ['settings'] ['allowed_values'])'作为'$ string'的内容。我已经澄清了这一点。 – Mike 2010-07-01 16:06:48

0

我会使用一个正则表达式匹配的每个条目的格局,但仅捕获感兴趣的文本。使用preg_match_all(...)$match对象填充了捕获组的子阵列。

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

产地:

需要注意的是,如果你是标签将使用数字,你需要调整的正则表达式。

如果存储在表格中的值可能无序,此方法还允许您捕获数字并创建自己的有序数组。