PHP - nokta sözdizimi ile arama dizi içeriği

7 Cevap php

Herkes aşağıdaki fonksiyonu ile yanlış bir şey görüyor mu? (Edit: Bu çok yaygın bir kod yolu eklenecektir beri hayır, ben yanlış bir şey olduğunu düşünmüyorum, ben sadece çift-kontrol duyuyorum.)

function getNestedVar(&$context, $name) {
    if (strstr($name, '.') === FALSE) {
        return $context[$name];
    } else {
        $pieces = explode('.', $name, 2);
        return getNestedVar($context[$pieces[0]], $pieces[1]);
    }
}

Bu aslında dönüştürür:

$data, "fruits.orange.quantity"

içine:

$data['fruits']['orange']['quantity']

Bağlamda, bu ben Smarty inşa ediyorum bir şeklidir programı içindir. Ben bu yüzden dize bir anahtar tabanlı şeklinde olması gerekir, ve doğrudan Smarty Smarty değişkene erişemezsiniz da form için adı gerekir.

7 Cevap

Iteratif bir yaklaşım deneyin:

function getNestedVar(&$context, $name) {
    $pieces = explode('.', $name);
    foreach ($pieces as $piece) {
        if (!is_array($context) || !array_key_exists($piece, $context)) {
            // error occurred
            return null;
        }
        $context = &$context[$piece];
    }
    return $context;
}

Bu iç içe ne kadar derin olacak? PHP özyineleme bir sınırı vardır, ca gibi görünüyor. ^ 16 2. Sadece bu test ve özyineleme derinliği 65420 PHP (5.2.9) sessizce (hiçbir hata) başarısız oldu.

Ben bu kodu ile yanlış bir şey görmüyorum. Ben de onu test ettik.

Bu sorunuza cevap oldu mu?

Düzenleme: Bu IMHO biraz daha güzel. Bu özyineleme kullanmak değildir, ve döner olmayan bir dizinin bir çocuk erişilir durumda null olarak.

function getNestedVar(array $array, $name) {
   $name = explode('.', $name);
   foreach($name as $namePart) {
      if (is_array($array)) return null;
      if (!isset($array[$name])) return null;
      $array = $array[$name];
   }

   return $array;
}

Şerefe

Bir veya daha fazla eleman var yoksa mevcut haliyle hiçbir hata / uyarı gösterilir

error_reporting(E_ALL|E_STRICT); ini_set('display_errors', 1);
$x = array();
getNestedVar($x, '1.2.3.4');
echo 'done.';

(tested with php 5.3.1/win32).
For some reason accessing a non-existing element in getNestedVar($context[$pieces[0]]... does not raise a warning message, which makes it really hard to debug and to find e.g. a typo.

Sadece html yararlanmak Neden olmasın .. name="fruit[orange]" bir dizi yapmak için .. yeterlidir.

Bir görünüm @ var http://github.com/projectmeta/Stingray

Okuma ve nokta notasyonu / sözdizimi aracılığıyla bir dizi yazmaya verir.

Örnek: http://github.com/projectmeta/Stingray#example-usage

Bu bir göz atın: https://gist.github.com/elfet/4713488

$dn = new DotNotation(['bar'=>['baz'=>['foo'=>true]]]);

$value = $dn->get('bar.baz.foo'); // $value == true

$dn->set('bar.baz.foo', false); // ['foo'=>false]

$dn->add('bar.baz', ['boo'=>true]); // ['foo'=>false,'boo'=>true]

Ve bu sınıf aynı zamanda testleri phpunit var.