سؤال

وأنا أحاول أن إنشاء مجموعة متعددة الأبعاد التي يتم تحديدها من قبل سلسلة أجزاء. أنا باستخدام . كمحدد، ولكل جزء (باستثناء لآخر) يجب أن يكون مجموعة من
مثلا:

config.debug.router.strictMode = true

وأريد نفس النتائج كما لو كان لي أن اكتب:

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

وهذه المشكلة هو حقا حصلت لي تسير في حلقة مفرغة، هو موضع تقدير أي مساعدة. شكرا!

هل كانت مفيدة؟

المحلول

لنفترض لدينا بالفعل المفتاح والقيمة في $key و$val، ثم هل يمكن قيام بذلك:

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

وبويلينج مجموعة من اليسار إلى اليمين:

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

ومن اليمين إلى اليسار:

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

نصائح أخرى

وأقول تقسيم كل شيء، تبدأ مع القيمة، والعمل الى الوراء من هناك، في كل مرة من خلال التفاف ما لديك داخل مجموعة أخرى. مثل ذلك:

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

وبالتأكيد إعادة كتابتها لذلك فقد التحقق من الخطأ.

والجواب البامية لتبدو جيدة.

ولكن، يبدو أنك تريد تحليل ملف .INI نموذجي.

والنظر في استخدام كود مكتبة بدلا من المتداول بنفسك.

وعلى سبيل المثال، Zend_Config يعالج هذا النوع شيء لطيف.

وأنا أحب JasonWolf الإجابة على هذا.

وأما بالنسبة للأخطاء المحتملة: نعم، ولكن كان يزود فكرة عظيمة، والآن الأمر متروك للقارئ لجعلها اقية من الرصاص

.

وكانت حاجتي أكثر قليلا الأساسية: من قائمة محددة، إنشاء مجموعة MD. I تعديل بسيط لرمز له أن يعطيني ذلك تماما. هذا الإصدار يقدم لك مجموعة مع أو بدون تحديد سلسلة أو حتى سلسلة دون محدد.

وآمل شخص يمكن أن تجعل هذا أفضل.

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

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

$value = null;

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


print_r($value);
// The attribute to the right of the equals sign
$rightOfEquals = true; 

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

// Array of identifiers
$identifiers = explode(".", $leftOfEquals);

// How many 'identifiers' we have
$numIdentifiers = count($identifiers);


// Iterate through each identifier backwards
// We do this backwards because we want the "innermost" array element
// to be defined first.
for ($i = ($numIdentifiers - 1); $i  >=0; $i--)
{

   // If we are looking at the "last" identifier, then we know what its
   // value is. It is the thing directly to the right of the equals sign.
   if ($i == ($numIdentifiers - 1)) 
   {   
      $a = array($identifiers[$i] => $rightOfEquals);
   }   
   // Otherwise, we recursively append our new attribute to the beginning of the array.
   else
   {   
      $a = array($identifiers[$i] => $a);
   }   

}

print_r($a);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top