2013-03-18 20 views
6

Bu, tüm akşam beni deli ediyor. Temel olarak, değeri dezenfekte ettikten sonra çok boyutlu bir dizide belirli bir değer ayarlamalıyım ve daha sonra (belki de validasyona bağlıdır; eğer doğrulama başarısız olursa, değer boş bir dizeye ayarlanmalıdır) değeri onayladıktan sonra. Diyelim ki bu yazı dizisi var diyelim:Referansa göre çok boyutlu dizide dinamik olarak değer nasıl ayarlanır

$data['should']['be']['int'] = ' yjd'; 

filter_var($value, FILTER_SANITIZE_NUMBER_INT); ile değerini Dezenfekte edildikten sonra geri boş bir dize alıyorum. O zaman bir şekilde $data['should']['be']['int'] değerini boş bir dize olarak ayarlamanız gerekir.

Bu değer daha sonra bir doğrulama işlevine iletilir, bu da başarısız olur, boş dizenin tam sayı olmamasına neden olur. Yine, bu onaylanmış değerin $data['should']['be']['int'] boş bir dizeye ayarlanması gerekir. Ben

$keys = array(
    0 => 'should', 
    1 => 'be', 
    2 => 'int' 
); 

:

bütün doğrulama şey zaman ben sterilize yoksa bu mevcut gibi bir şey var doğrulamak gerekir bu yüzden, bir dizideki tüm ilgili anahtarları tasarrufu olduğum başladı önce ve daha sonra &$data dizisine referans vererek yukarıdaki değeri kullanarak bir foreach döngüsünde $data dizisine erişmeyi denedim, ancak yeni değeri ayarlamak için denedim, ancak ne denediysem denemedim. Yukarıdaki sadece basitleştirilmiş bir örnektir. Her şey bir doğrulama sınıfının bir parçası olduğundan, bu yüzden geçen $data dizisinin tam derinliğini bilmiyorum.

Herhangi bir işaretçi çok takdir edilecektir! Yardım ettiğin için teşekkür ederim!

Düzeltme: Düşünce Bu gönderiyi düzenleyemiyorum, ancak sadece internet bağlantım oldu. Lütfen aşağıdaki yorumumu dikkate almayın.

protected function set_value(&$data, $value) { 
    foreach($data as &$val) { 
     if(is_array($val)) { 
      $this->set_value($val, $value); 
     } else { 
      $val = $value; 
     } 
    } 
} 

Ben bu did döngüye başlamak için:: Neyse, işte ben yinelemeli arama çalıştı yöntemidir

$this->set_value($data[$keys[0]], $value); 
+0

Yorum kaldırıldı, lütfen yukarıdaki düzenlemeye bakın. – shabushabu

cevap

11

Deneyebilirsin

$data = array(); 
$keys = array(
     0 => 'should', 
     1 => 'be', 
     2 => 'int' 
); 

$value = 'yjd'; 



echo "<pre>"; 
setValue($data,$keys,$value); 
print_r($data); 

Çıktı

Array 
(
    [should] => Array 
     (
      [be] => Array 
       (
        [int] => yjd 
       ) 

     ) 

) 

Kullanılan İşlev

function setValue(&$data, $path, $value) { 
    $temp = &$data; 
    foreach ($path as $key) { 
     $temp = &$temp[$key]; 
    } 
    $temp = $value; 
    return $value ; 
} 
+1

Teşekkürler, bir çekicilik gibi çalışır. Şimdi işlevi görüyorum ki bu mantıklı. – shabushabu

+0

harika, çok tks! – fcaserio

+0

Sayısal ve birleştirici, mükemmel iş için evrensel! – Zydnar

2

Sen ouzo goodies ile yapabilirsiniz:

Arrays::setNestedValue($array, array('should', 'be', 'int'), 'value'); 

İlgili konular