PHP问题 - 如何将字符串转换为数组?

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函数,一次用于空格,一次用于竖线,但由于"Almost Extinct"中的空格,这也行不通......


你需要发布更多的代码,你最初是谁创建了这个字符串? - Josh K
你希望数组的样子是怎样的? - Joseph
你需要更改数据库的设置,将这些设置存储在单独的字段中。 - Your Common Sense
4个回答

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

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
)

它看起来与问题中的数组不同(键不同)。 - Tom Pažourek
我只是将 unserialized($r['settings']['allowed_values']) 的输出用作 $string 的内容。现在我已经澄清了这一点。 - 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"
}

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    
)

请注意,如果您的标签将使用数字,则需要调整正则表达式。
此方法还允许您捕获数字并创建自己的有序数组,如果存储在您的表格中的值可能是无序的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接