Bir dizi alan Patlayan ve değiştirilmesi

5 Cevap php

Yani, ilgili olmayan nedenlerle, kendi içinde bir Imploded alan vardır, bir dizi var. Şimdi, bu alanda dize patlayan ve patlamanın sonuçları ile bu alan yerine ilgileniyorum. Ben tür-sorta burada çalışan bir çözüm var, ama aksak görünüyor, ve ben daha verimli bir şey ilgileniyorum. Ya da en azından estetik.

Örnek bir dizi:

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

Ve hedef 'color', 'lenght', 'size' alanları ile 'kind' alanını değiştirmektir.

Şimdiye kadar var:

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

Bu should (ezbere yazıyorum, benim kendi koduna erişim yok, ve ben sadece yazdım birini doğrulamak değil ... böylece herhangi bir hata varsa özür dilerim) yeni bir dizi neden, bu gibi bir şey görünüyor:

$new_items = array(
               'name' => 'shirt', 
               'color' => 'blue', 
               'lenght' => 'long', 
               'size' => 'L', 
               'price' => 10, 
               'amount' => 5);

Ben, örneğin, sadece $items dizisi ve unset($items['kind']) bu değerleri eklemek olabilir, ama bu ayarsız sırasını atmak istiyorsunuz, ve ben biraz sonraki {[(2 için ihtiyaç )]} döngüler.

Yani, bunu yapmak için kolay bir yolu var mı?

EDIT: (Reply to Visage and Ignacio - since reply messes the code up) If I call one in a foreach loop, it calls them in a specific order. If I just append, I mess with the order I need for a table display. I'd have to complicate the display code, which relies on a set way I get the initial data. Currently, I display data with (or equivalent):

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

Ben sadece append, ben böyle bir şey yapmak zorunda olurdu:

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 Cevap

Ilişkilendirilebilir diziler genellikle sipariş üzerine bağlı olmamalıdır. Ben doğrudan sadece dizine dizi daha sonra kodunu değiştirerek düşünün ve döngü vazgeçmek olacaktır.

Bu deneyin:

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

Bunu test ettik ama çalışması gerekir.

Ilişkilendirilebilir diziler bir emir yok, bu yüzden anahtarları artık sadece unset istiyorum ve daha sonra sadece yeni anahtarlar için yeni değerler atamak.

tek yön

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

Iki sayısal sipariş diziler içine anahtarları ve değerleri böler ve sonunda onları birleştirir, çünkü bu sıralamasını korumak gerekir. Bu daha verimli değil, ama kod okumak daha kolaydır.

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