【问题标题】:PHP - Convert information supplied in a string format to an array formatPHP - 将以字符串格式提供的信息转换为数组格式
【发布时间】:2019-05-21 23:36:38
【问题描述】:
$attribute_options_string = "Spice (Very Hot/3, Hot/2, Medium/1) | Size(Small,Medium,Large)";

$attribute_options_array = array(
 'spice' => array(
    'very hot' =>3,
     'hot' => 2,
     'medium' => 1
 ),
    'size' => array(
        'small',
        'medium',
        'large'
    )
);

我正在尝试编写一个将字符串格式转换为数组格式的函数。

【问题讨论】:

  • 好的。你试过什么?为什么它不起作用?
  • 管道爆炸、循环、逗号爆炸、循环、斜线爆炸(如果需要)、利润
  • @tim 没那么简单,你还得提取选项名称(Spice/Size)
  • @Nick "如果需要,在斜线上爆炸" :-)
  • @tim 对不起,我不应该说Spice/Size,我指的是在管道上爆炸后提取字符串开头的值。

标签: php arrays regex string


【解决方案1】:

正如@tim 在 cmets 中简洁描述的那样,您只需要:

在管道上爆炸、循环、在逗号上爆炸、循环、在斜线上爆炸(如果需要)

这并不是那么简单,因为您需要提取选项名称,而且由于您的字符串中似乎有可变间距,因此使用preg_split 而不是explode 更安全。根据您的示例数据,这将起作用:

$attribute_options_string = "Spice (Very Hot/3, Hot/2, Medium/1) | Size(Small,Medium,Large)";
$attribute_options_array = array();
$attributes = preg_split('/\s*\|\s*/', $attribute_options_string);
foreach ($attributes as $attribute) {
    preg_match('/\s*(\w+)\s*\(([^)]+)/', $attribute, $matches);
    $attribute_name = strtolower($matches[1]);
    $options = preg_split('/\s*,\s*/', $matches[2]);
    foreach ($options as $option) {
        if (strpos($option, '/') !== false) {
            list($option_name, $option_value) = preg_split('#\s*/\s*#', $option);
            $attribute_options_array[$attribute_name][strtolower($option_name)] = $option_value;
        }
        else {
            $attribute_options_array[$attribute_name][] = strtolower($option);
        }
    }
}
var_export($attribute_options_array);

输出:

array (
  'spice' => array (
    'very hot' => '3',
    'hot' => '2',
    'medium' => '1',
  ),
  'size' => array (
    0 => 'small',
    1 => 'medium',
    2 => 'large', 
  ), 
)

Demo on 3v4l.org

【讨论】:

  • @user1502826 不用担心。我很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 2012-03-20
  • 2012-02-14
  • 2016-03-07
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多