2014-11-24 3 views
0

У меня есть массив, где мне нужен путь (ключи) к заданному значению. Я написал для него функцию, но я не могу заставить ее работать, у массива может быть бесконечная глубина, которую нужно контролировать в другой функции, я еще не определился с лимитом, но глубина - переменная, она действительно работает до точки, но глубина может быть 30-40-50 глубиной, поэтому мне нужно, чтобы она работала именно так, эта функция действительно просто для идентификации значений, числа - это шаблоны, теги - теги в шаблонах, каждый тег имеет один шаблон, связанный с ним, все имена шаблонов уникальны, а имена тегов не связаны с тем, что они связаны только с одним шаблоном, значения идентификатора разделены тире (незаконными в шаблонах и тегах), где идентификаторы шаблона являются только числовыми и тегами Иды обернуты squigglies и знак доллара, подобный {$ TAG}, не нужно беспокоиться о повторяющихся значениях, потому что запрещены бесконечные циклы (шаблон не может ссылаться на себя или шаблон, который ссылается на себя) плюс идентификаторы указаны только для шаблонов, где имена шаблонов уникальны. Идентификатор шаблона с именем 4 в данном массиве будет 0 - {$ CONTENT} -2 - {$ PARAGRAPH} -4, где я потеряю его, моя функция не выйдет за эту глубину, спасибо за помощьпуть к массиву глубокий многомерный массив

array (size=1) 
    0 => 
    array (size=4) 
     '{$TITLE}' => null 
     '{$NAME}' => null 
     '{$FRIENDS}' => 
      array (size=1) 
      1 => 
       array (size=2) 
       '{$friend}' => null 
       '{$friends[$i]}' => null 
     '{$CONTENT}' => 
     array (size=1) 
      2 => 
      '{$HEADING}' => 
       array (size=1) 
       3 => 
        array (size=0) 
        empty 
      '{$PARAGRAPH}' => 
       array (size=1) 
       4 => 
        array (size=1) 
        '{$AnotherParagraph}' => null 

вот моя функция, я добавил переменную глубины только для целей тестирования, $ this-> family - это массив, указанный выше, вызывающий функцию: $ id = $ this-> get_id (4);

public function get_id($member, $family=null, $id=null, $depth=0) { 
    if (empty($this->family)) { 
     return false; 
    } 
    if (is_null($family)) { 
     $family = $this->family; 
    } 

    foreach ($family as $parent => $tag_child) { 
     if ($member === $parent) { 
      return $member; 
     } 

     foreach ($tag_child as $tag => $child) { 
      if (is_null($child) || empty($child)) { 
       continue; 
      } 

      $childkey = key($child); 

      if ($member === $childkey) { 
       $id .= '-'.$parent.'-'.$tag.'-'.$member; 
       $id = ltrim($id, '-'); 
       return $id; 
      } 

      $family = $child; 

      if (!is_null($id) && !empty($id)) { 
       $id_array = explode('-', $id); 
       foreach ($id_array as $id_value) { 
        if ($id_value !== $childkey) { 
         $new_id_array[] = $id_value; 
        }else{ 
         break; 
        } 
       } 
       $id = implode('-', $new_id_array); 
      } 

      if ($parent === 0) { 
       $id = $parent.'-'.$tag.'-'.$childkey; 
      }else{ 
       $id .= '-'.$tag.'-'.$childkey; 
      } 

      $id = ltrim($id, '-'); 

      $depth++; 

      $id = $this->get_id($member, $family, $id, $depth); 

     } 

    } 
} 
+0

Как вы присваивающая ключи массива? То, как вы настроите его, плохо, потому что по умолчанию для ключей назначаются числовые значения, у вас есть что-то, что должно сидеть в индексе 0 как 4. Как только вы получите другой массив на верхнем уровне, ваш скрипт сломается. – Bankzilla

+0

, потому что характер шаблонов, которые он запускает в базовой концепции шаблона, когда скомпилирован базовый шаблон, в конце будет только один html-файл, который будет отправлен в браузер, цель класса - сохранить базовый шаблон и запись всех детей, класс PTE_Family и функция, которую я использую для установки массива, находится в следующем комментарии – user1205600

+0

'\t public function set_value ($ id, $ member) { \t \t $ var = & $ this- > семья; \t \t $ id = explode ('-', $ id); \t \t array_pop ($ id); \t \t Еогеасп ($ ID, как $ ключ) { \t \t \t, если (array_key_exists ($ ключ, $ VAR)) { \t \t \t \t $ переменная = & $ Var [$ ключ]; \t \t \t} еще { \t \t \t \t возвращение ложным; \t \t \t} \t \t} \t \t $ переменная = $ член; \t} – user1205600

ответ

1

Используйте рекурсивную функцию. Вот один, который я написал для этой цели EXACT.

public function recurseArray($array, $builtKey = "") { 
    $values = array(); 
    foreach ($array as $key => $value) { 
     if (is_array($value)) { 
      if (!empty($builtKey)) { 
       $values = array_merge($values, recurseArray($value, $builtKey.".".$key)); 
      } else { 
       $values = array_merge($values, recurseArray($value, $key)); 
      } 
     } else { 
      if (!empty($builtKey)) { 
       $values[$builtKey.".".$key] = $value; 
      } else { 
       $values[$key] = $value; 
      } 
     } 
    } 
    return $values; 
} 

Это приводит к плоской решетке, меняющее это:

array(
    "key" => array(
     "of" => array(
      "many" => array(
       "depths" => "value" 
      ) 
     ) 
    ), 
    "key2" => "value" 
); 

В это:

array(
    "key.of.many.depths" => "value", 
    "key2" => "value" 
); 
+0

, работающий на нем ... – user1205600

+0

Работая над ним?Вам нужно что-то еще, или вы работаете над реализацией функции, которую я предоставлял, или вы работаете самостоятельно? – JRL

+0

BTW, если вы поместили эту функцию внутри класса (как я ее первоначально имел), не забудьте изменить два вызова INSIDE для функции из recurseArray() в $ this-> recurseArray() – JRL

Смежные вопросы