Yinelemeli çok boyutlu bir dizi oluşturmak için nasıl?

4 Cevap php

I am trying to create a multi-dimensional array whose parts are determined by a string. I'm using . as the delimiter, and each part (except for the last) should be an array
ex:

config.debug.router.strictMode = true

Ben yazın sanki ben aynı sonuçları istiyorum:

$arr = array('config' => array('debug' => array('router' => array('strictMode' => true))));

Bu sorun gerçekten beni çevrelerinde gidiş var olduğunu, herhangi bir yardım takdir edilmektedir. Teşekkürler!

4 Cevap

Kullanıcının biz zaten $key ve $val, o zaman bu yapabilirdi anahtar ve değere sahip varsayalım:

$key = 'config.debug.router.strictMode';
$val = true;
$path = explode('.', $key);

Sağa soldan dizi Builing:

$arr = array();
$tmp = &$arr;
foreach ($path as $segment) {
    $tmp[$segment] = array();
    $tmp = &$tmp[$segment];
}
$tmp = $val;

Ve sağdan sola:

$arr = array();
$tmp = $val;
while ($segment = array_pop($path)) {
    $tmp = array($segment => $tmp);
}
$arr = $tmp;

Ben her şeyi bölmek, değeri ile başlar ve başka bir dizi içinde ne var sarma, oradan geriye doğru her zaman çalışmak demek. Şöyle:

$s = 'config.debug.router.strictMode = true';
list($parts, $value) = explode(' = ', $s);

$parts = explode('.', $parts);
while($parts) {
   $value = array(array_pop($parts) => $value);
}

print_r($parts);

Bu hata denetimi vardır bu yüzden kesinlikle yeniden.

Gumbo cevabı iyi görünüyor.

Tipik bir. Ini dosyasını ayrıştırmak istediğiniz gibi Ancak görünüyor.

Kitaplık kodu kullanarak yerine kendi haddeleme düşünün.

Örneğin, Zend_Config güzel şey bu tür işler.

Ben gerçekten bu JasonWolf cevabını istiyorum.

Olası hatalar için: Evet, ama şimdi bunun kurşun geçirmez yapmak için okuyucuya kalmış, harika bir fikir verilir.

Benim ihtiyacı biraz daha temel: sınırlandırılmış bir listeden, bir MD dizi oluşturun. Ben biraz sadece bana vermek onun kodu değiştirilmiş. Bu sürüm size sınırlayıcı olmadan tanımlamak dize veya hatta bir dize olan veya olmayan bir dizi verecektir.

Birisi bu daha iyi yapabilirsiniz umuyoruz.

$parts = "config.debug.router.strictMode";

$parts = explode(".", $parts);

$value = null;

while($parts) {
  $value = array(array_pop($parts) => $value);
}


print_r($value);