1

我有一个字符串,我想从中分离并制作一个多维数组。字符串如下所示:

$string = "item-size:large,color:blue,material:cotton,item-size:medium,color:red,material:silk,";

不幸的是,我无法控制字符串的组合方式,这就是我尝试制作这个数组的原因。

我的目标是制作这样的数组:

$item[1]['color'] // = blue
$item[2]['material'] // = silk

所以,这就是我所做的:

$item = array();

$i=0; // I know this is messy
$eachitem = explode("item-",$string);
array_shift($eachitem); // get rid of the first empty item  

foreach ($eachitem as $values) {

    $i++; // Again, very messy
    $eachvalue = explode(",",$values);
    array_pop($eachvalue); // get rid of the last comma before each new item

    foreach ($eachvalue as $key => $value) {

        $item[$i][$key] = $value;

    }

}

我显然对此感到迷茫……有什么建议吗?

4

4 回答 4

0

你很接近,这就是我的做法:

$string = "item-size:large,color:blue,material:cotton,item-size:medium,color:red,material:silk,";
$substr = explode("item-", $string);
$items = array();
foreach ($substr as $string) {
    $subitems = array();
    $pairs = explode(",", $string);
    foreach ($pairs as $pair) {
        list($key, $value) = explode(":", $pair, 2);
        $subitems[$key] = $value;
    }
    $items[] = $subitems;
}
var_dump($items);

在这里使用list很棒:) 请注意,您需要额外的计数限制器,explode否则如果有更多数据,您可能会丢失数据:

于 2012-05-10T16:23:23.363 回答
0
$array = array();
$string = explode(',', $string);
foreach($string as $part):
   $part = trim($part);
   if(strlen($part) < 3) continue;
   $part = explode(':', $part);
   $array[$part[0]] = $part[1];
endforeach;
于 2012-05-10T16:27:57.337 回答
0

你大部分时间都在。只需将您的内部替换foreach

foreach ($eachvalue as $value) {
    $properties = explode(':', $value);
    $item[$i][$properties[0]] = $properties[1];

}
于 2012-05-10T16:29:59.210 回答
0
$string = "item-size:large,color:blue,material:cotton,item-size:medium,color:red,material:silk,";
$num_attr = 3;

$item = array();
$i=$x=0;
foreach(explode(',', trim($string,',')) as $attr)
{
    list($key, $value) = explode(':', $attr);
    $item[$x+=($i%$num_attr==0?1:0)][$key] = $value;
    $i++;
}

将 $num_attr 设置为字符串中项目属性的数量(如果它们增长/缩小,这将允许在未来进行调整)。foreach 内的修剪正在删除任何“空”数据,例如最后一个逗号(如果出现的话,它也会删除一个空的第一个逗号)。看起来很疯狂的 $item[$x+=($i%$num_attr==0?1:0)] 正在采用计数器的模数/属性数,当它为 0 时,这意味着我们处于新产品线,所以我们将 1 添加到填充项目编号索引的 x,如果模数返回一个数字,那么我们知道我们在同一个产品上,所以我们添加 0,这不会更改项目索引,以便将属性添加到同一个项目。

于 2012-05-10T17:16:48.830 回答