在我的数据库中,某些字段设置被序列化并存储。当我这样做时:
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
)
哪个有道理,但显然不是我所希望的......所以,我只是想知道是否有一种简单的方法来做我在这里尝试的事情?我想过多次使用爆炸,一次用于空间,一次用于管道,但由于“几乎灭绝”中的空间而无法使用......
答案 0 :(得分:3)
试试这个:
$tab=array();
preg_match_all("/\s*(\d+)\|([^\d]+)/",$r['allowed_values'],$tab);
print_r(array_combine($tab[1],$tab[2]));
这应该成功:)
答案 1 :(得分:2)
如果原始索引不是从1顺序,并且您需要保持它们原样,请参阅dweeves answer,因为这样可以使索引和值保持正确绑定在一起。
$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
)
答案 2 :(得分: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"
}
答案 3 :(得分: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
)
请注意,如果你的标签会使用数字,你需要调整正则表达式。
如果表中存储的值可能出现故障,此方法还允许您捕获数字并创建自己的有序数组。