Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从这个字符串创建多维PHP数组?_Php_Arrays_Multidimensional Array - Fatal编程技术网

如何从这个字符串创建多维PHP数组?

如何从这个字符串创建多维PHP数组?,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有一个字符串,我想把它分离出来,并用它组成一个多维数组。字符串如下所示: $string = "item-size:large,color:blue,material:cotton,item-size:medium,color:red,material:silk,"; $item[1]['color'] // = blue $item[2]['material'] // = silk 不幸的是,我无法控制字符串是如何组合在一起的,这就是为什么我要制作这个数组 我的目标是制作如下数组: $s

我有一个字符串,我想把它分离出来,并用它组成一个多维数组。字符串如下所示:

$string = "item-size:large,color:blue,material:cotton,item-size:medium,color:red,material:silk,";
$item[1]['color'] // = blue
$item[2]['material'] // = silk
不幸的是,我无法控制字符串是如何组合在一起的,这就是为什么我要制作这个数组

我的目标是制作如下数组:

$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;

    }

}

我显然对这件事感到迷茫。。。有什么建议吗?

你很接近了,我会这样做:

$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);

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

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


将$num_attr设置为字符串中项目属性的数量,这将允许将来在项目属性增长/收缩时进行调整。foreach内部的修剪会删除空数据,就像最后一个逗号一样。如果出现空的第一个逗号,它也会删除空的第一个逗号。看起来很疯狂的$item[$x+=$i%$num_attr==0?1:0]取计数器/属性数的模,当它为0时,这意味着我们在一个新的产品线上,因此我们将1添加到x,从而填充项目数索引,如果模数返回一个数字,那么我们知道我们是在同一个产品上,所以我们添加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++;
}