【问题标题】:PHP Question - How to create an array out of a string?PHP 问题 - 如何从字符串中创建一个数组?
【发布时间】:2010-07-01 15:29:24
【问题描述】:

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

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,一次用于空间,一次用于管道,但这也行不通,因为“几乎灭绝”中的空间......

【问题讨论】:

  • 您需要发布更多代码,您最初创建的字符串是谁?
  • 你希望数组是什么样子的?
  • 您必须更改数据库设置,才能将这些设置存储在单独的字段中

标签: php arrays explode


【解决方案1】:

试试这个:

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

这应该可以解决问题:)

【讨论】:

  • 除了(\w+) 将不匹配“几乎灭绝”。将其替换为 ([^\d]+) 假设“值”中永远不会包含数字,这应该可以解决问题。使用固定的正则表达式,这个答案是我认为的最佳解决方案,因为它不假设数字将从最低到最高排序,并盲目地将每个值推到数组的末尾
【解决方案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
)

【讨论】:

  • 它看起来与问题中的数组不同(不同的键)。
  • 我刚刚使用了unserialized($r['settings']['allowed_values']) 的输出作为$string 的内容。我现在已经澄清了。
【解决方案3】:

我认为这应该可行。 这将第一个数字和“|”分开字符

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      相关资源
      最近更新 更多