爆炸并替换一个阵列字段

时间:2010-01-18 08:58:28

标签: php arrays explode

所以,我有一个阵列,由于无关的原因,本身就有一个内爆场。现在,我有兴趣在该字段中爆炸字符串,并用爆炸的结果替换该字段。我有点在这里有一个有效的解决方案,但它看起来很笨重,而且我对更高效的东西感兴趣。或者至少在美学上令人愉悦。

示例数组:

$items = array(
               'name' => 'shirt', 
               'kind' => 'blue|long|L', 
               'price' => 10, 
               'amount' => 5);

目标是将'kind'字段替换为'color', 'lenght', 'size'字段。

到目前为止,我已经:

$attribs = array('color', 'lenght', 'size');  // future indices
$temp = explode("|", $items['kind']);  // exploding the field
foreach ($items as $key => $value) {  // iterating through old array
    if ($key == 'kind') {
        foreach ($temp as $k => $v) {  // iterating through exploded array
            $new_items[$attribs[$k]] = $v;  // assigning new array, exploded values
        }
    }
    else $new_items[$key] = $value;  // assigning new array, untouched values
}

这个应该(我正在写作,无法访问我自己的代码,我无法验证我刚写的那个......所以如果有任何错误,我道歉)导致一个新的数组,看起来像这样:

$new_items = array(
               'name' => 'shirt', 
               'color' => 'blue', 
               'lenght' => 'long', 
               'size' => 'L', 
               'price' => 10, 
               'amount' => 5);
例如,我可以将这些值附加到$items数组和unset($items['kind']),但是这会使订单失效,我有必要将其用于后续的foreach环路。

那么,有没有更简单的方法呢?

编辑: (回复Visage和Ignacio - 因为回复混淆了代码) 如果我在foreach循环中调用一个,它会按特定顺序调用它们。如果我只是追加,我会把桌面显示所需的顺序搞得一团糟。我必须使显示代码复杂化,这依赖于我获取初始数据的设定方式。 目前,我用(或等效)显示数据:

foreach($new_items as $v) echo "<td>$v</td>\n";

如果我只是附加,我必须做类似的事情:

echo "<td>$new_items['name']</td>\n";
foreach ($attribs as $v) echo "<td>$new_items[$v]</td>\n";
echo "<td>$new_items['price']</td>\n";
echo "<td>$new_items['amount']</td>\n";

5 个答案:

答案 0 :(得分:1)

关联数组通常不应该依赖于顺序。我会考虑修改后面的代码直接索引数组并放弃循环。

答案 1 :(得分:0)

试试这个:

$items = array( 'name' => 'shirt', 'kind' => 'blue|long|L', 'price' => 10, 'amount' => 5);
list($items['color'], $items['lenght'], $items['size'])=explode("|",$items['kind']);
unset $items['kind'];

我没有对它进行测试,但它应该有效。

答案 2 :(得分:0)

关联数组没有订单,因此您可以取消设置不再需要的键,然后只需将新值分配给新键。

答案 3 :(得分:0)

单程

$items = array(
               'name' => 'shirt',
               'kind' => 'blue|long|L',
               'price' => 10,
               'amount' => 5);
$attribs = array('color', 'lenght', 'size');
$temp = explode("|", $items['kind']);
$s = array_combine($attribs,$temp);
unset($items["kind"]);
print_r( array_merge( $items, $s) );

答案 4 :(得分:0)

这应该保留排序,因为它将键和值分成两个数字排序的数组,并在最后组合它们。它不是更有效,但代码更容易阅读。

$kind_keys = array('color', 'length', 'size');
$kind_values = explode("|", $items['kind']);
$keys = array_keys($items);
$values = array_values($items);
$index = array_search('kind', $keys);

// Put the new keys/values in:
array_splice($keys, $index, 1, $kind_keys);
array_splice($values, $index, 1, $kind_values);

// combine the result into a new array:
$result = array_combine($keys, $values));