3

在我的数据库中,一些字段设置被序列化和存储。当我这样做时:

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
)

问题是,当我使用 explode("|", $r['allowed_values']) 时,我得到:

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

哪个,有道理,但显然不是我所希望的......所以,我只是想知道是否有一种简单的方法来做我在这里尝试的事情?我考虑过多次使用explode,一次用于空间,一次用于管道,但这也行不通,因为“几乎灭绝”中的空间......

4

4 回答 4

3

试试这个:

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

这应该是诀窍:)

于 2010-07-01T15:44:56.420 回答
2

如果原始索引不是从 1 开始的顺序,并且您需要将它们保持原样,请参阅 dweeves 的答案,因为这样可以使索引和值正确绑定在一起。

$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
)
于 2010-07-01T15:46:33.190 回答
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"
}
于 2010-07-01T15:38:15.943 回答
0

我会使用正则表达式来匹配每个条目的模式,但只捕获感兴趣的文本。使用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    
)

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

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

于 2010-07-01T15:59:46.900 回答