【问题标题】:Exploding and replacing one array field爆炸和替换一个数组字段
【发布时间】:2010-01-18 08:58:28
【问题描述】:

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

示例数组:

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

【问题讨论】:

    标签: php arrays explode


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      试试这个:

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

      我还没有测试过,但它应该可以工作。

      【讨论】:

      • 嗯,它确实有效,但附加到末尾(因此,与编辑中解释的问题相同)。奇怪的是,虽然......当我用你的代码做一个 print_r($items) 时,它没有将键列为 name-price-cost-color-lenght-size (正如我所期望的那样,就像它对 ghostdog 的代码一样),但顺序为名称-价格-成本-尺寸-长度-颜色。从爆炸中得到的三个是相反的。怎么会?
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        一种方式

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2013-12-15
            • 2016-02-08
            • 1970-01-01
            • 2011-04-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-25
            相关资源
            最近更新 更多