0

したがって、無関係な理由で、それ自体に内破されたフィールドが 1 つある配列があります。今、私はそのフィールドの文字列を爆発させ、そのフィールドを爆発の結果に置き換えることに興味があります。私はちょっとした解決策をここに持っていますが、それは不格好に見え、もっと効率的なものに興味があります. または、少なくとも審美的に満足しています。

配列の例:

$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たとえば、これらの値を配列 andに追加することもできますが、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";
4

5 に答える 5

1

連想配列は通常、順序に依存すべきではありません。後のコードを変更して、配列に直接インデックスを付け、ループを放棄することを検討します。

于 2010-01-18T09:10:57.017 に答える
0

これは、キーと値を数値順に並べられた 2 つの配列に分割し、最後にそれらを結合するため、順序を保持する必要があります。効率は良くありませんが、コードが読みやすくなります。

$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));
于 2014-03-18T05:51:25.453 に答える
0

連想配列には順序がないため、不要になったキーの設定を解除して、新しい値を新しいキーに割り当てるだけです。

于 2010-01-18T09:12:39.430 に答える
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'];

私はそれをテストしていませんが、動作するはずです。

于 2010-01-18T09:06:48.530 に答える
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) );
于 2010-01-18T09:13:10.210 に答える