PHP nasıl ben bir asssociative dizideki değerleri güncelleştirmek ve tüm dizi saklamak?

4 Cevap

Burada bir kod örneği var:

  $array = array();

  $array['master']['slave'] = "foo";

  foreach ($array as $key => $value) {

    foreach ($value as $key2 => $value2) {

      if (preg_match('/slave/',$key2)) {

        $value[$key2] = "bar";
        print "$value[$key2] => $key2 => $value2\n";
      }
    }
  }

  print_r($array);

Çıktı:

bar => slave => foo

Array

(

    [master] => Array

        (
            [slave] => foo
        )

)

Aksine ben son dizi olarak aşağıdaki istiyorum:

Array
(

    [master] => Array

        (
            [slave] => bar
        )

)

Yanlış ben burada ne yapıyorum?

Teşekkür ederiz!

Note: Example2:

$a= array('l1'=>array('l2'=>array('l3'=>array('l4'=>array('l5'=>'foo')))));

$a['l1']['l2']['l3']['l4']['l5'] = 'bar';

foreach ($a as $i => &$values) {
    foreach ( $values as $key => &$value) {
        if (is_array($value)){
            print_array($value,$key);
        }
    }
}

function print_array ($Array, $parent) {
  foreach ($Array as $i1 => &$values1) {
    if (is_array($values1)){
      foreach ($values1 as $key1 => &$value1) {
        if (is_array($value1)) {
          print_array($value1,$values1);
        }
        else {
          print "       $key1 => $value1\n";
        }
      }
    }
    else {
      if (preg_match('/l5/',$i1)) {
        $values1 = "foobar";
        print "       $i1 => $values1\n";
      }
    }
  }
}

print_r($a);

Çıktı l5 in 'filanca' yansıtmıyor

4 Cevap

foreach dizinin bir kopyası üzerinde çalışır çünkü. hakkında Belgeleri okuyun foreach :

Not: Dizi referenced sürece, foreach, bir copy belirtilen dizinin olup dizinin kendisi üzerinde çalışır. foreach dizisi işaretçisi üzerinde bazı yan etkileri vardır. Sıfırlayarak olmadan foreach sırasında veya sonrasında dizi işaretçisi güvenmeyin.

Peki ne yapmanız gerektiğini

foreach ($array as $key => &$value) {

    foreach ($value as $key2 => $value2) {
          //...
    }
}

Update:

Tamam, ben sizin kodunuzu yeniden gözden:

  1. Sizin kodu döngüler tuşu ile dizi ulaşmak asla olarak çalışan l5. Değildi
  2. Kod son derece verimsiz. Sen girdi dizisinin derinliği hakkında varsayımlar yapmak. Örneğin kod (Eğer bir dizi atlarsanız çalışması gerekir) temin giriş dizisini işleyemiyor.

Solution:

Yararlanın recursion. Bu kod çalışır:

$a =array('l1'=>array('l2'=>array('l3'=>array('l4'=>array('l5'=>'foo')))));

function process(&$array, $needle) {
    foreach($array as $k => &$v) {
        if ($k == $needle) {
             $v = "boooooooooo";
             print "$k => $v\n";
        }
        if (is_array($v)) {
             process($v, $needle);
        }
    }
}   

process($a, $needle);
print_r($a);

Umut olur.

Oh ve diğer Bir dahaki sefere kullanın lütfen. Ben anahtar 15 (onbeş) idi bütün zaman düşündüm ve benim örnek (15 l5 o farklı görünüyor değil ;) çalışmıyor neden merak ediyordum Bir bakışta).

Bir kaç seçenek var, ama bu hat üzerinde kaynaklanan aynı sorun, tüm kök

foreach ($array as $key => $value) {

Veri yapısı içinde diziler 2. boyutuna kod bu noktada, $value is not bir referans. Bunu düzeltmek için bir kaç seçenek var.

1) bir referans zorla

foreach ($array as $key => &$value) {

2) istenen değeri ayarlamak için bir "tam yetkili" ifadesini kullanın

$array[$key][$key2] = 'bar';

$ Değer, yeni bir değişken olduğundan,

Neden sadece:

foreach ($array as $key => &$value)
{
  if(isset($value['slave']))
    $value['slave'] = 'bar';
};