2012-03-10 23 views
5

के साथ पुन: संरचना एन-स्तरीय सरणी पुन: संरचना एक सरणी को पुन: स्थापित करना चाहते हैं और स्टकओवरफ्लो पर कुछ समाधानों ने मुझे 1-स्तर के स्तर के आइटमों के लिए "उचित" बनाने में मदद की, लेकिन आप ' देखेंगे कि सरणी एन-स्तर गहरी है।अभिभावक/बाल संबंध (PHP)

विधि पुनर्गठन() का उपयोग बार-बार नहीं किया जाना चाहिए (यह होना चाहिए)। यह शायद गलत है, और यह नहीं पता कि इसे सही कैसे बनाया जाए।

बच्चों कुंजी का कहना है वहाँ संबंधित पहचान-पत्र के साथ बच्चों, माता पिता महत्वपूर्ण सूत्र पैरेंट आईडी के लिए आइटम हैं।

class FilterMenu { 

    protected $tree = array(); 

    static protected $structure = array(); 

    public function __construct(array $tree) 
    { 
     $this->tree = $tree; 
    } 

    public function getStructure() 
    { 
     self::restructure($this->tree); 
     return self::$structure; 
    } 

    static public function restructure(array $structure) 
    { 
     foreach ($structure as $k => $v) 
     { 
      if (isset($v['parent']) and isset($v['children']) and count($v['children']) == 1) 
      { 
       // only 1 child 
       self::$structure[$k] = current(array_keys($v['children'])); 
      } 
      elseif (isset($v['children'])) 
      { 
       $keys = array_keys($v['children']); 
       self::$structure[$k] = array_combine($keys, $keys); // mirror array 

       //self::restructure($v['children']); 
      } 
      else 
      { 
       // no children 
       self::$structure[$k] = $k; 
      } 
     } 
    } 
} 



// test array 

$tree = array(
    1 => array(
     'parent' => 1 
    ), 
    2 => array(
     'parent' => 2, 
     'children' => array(
      3 => array(
       'parent' => 2 
      ), 
      6 => array(
       'parent' => 2, 
       'children' => array(
        10 => array(
         'parent' => 6, 
         'children' => array(
          4 => array(
           'parent' => 10 
          ) 
         ) 
        ) 
       ), 
      ), 
     ), 
    ), 
    7 => array(
     'parent' => 7, 
     'children' => array(
      11 => array(
       'parent' => 7 
      ) 
     ) 
    ), 
    14 => array(
     'parent' => 14, 
     'children' => array(
      15 => array(
       'parent' => 14, 
      ), 
      16 => array(
       'parent' => 14, 
      ), 
      19 => array(
       'parent' => 14, 
      ), 
      20 => array(
       'parent' => 14, 
      ), 
      21 => array(
       'parent' => 14, 
      ), 
     ) 
    ) 
); 

// test: 
$tree = new FilterMenu($tree); 
echo '<pre>'.print_r($tree->getStructure(), true); 

वास्तविक परिणाम:

Array 
(
    [1] => 1 
    [2] => Array 
     (
      [3] => 3 
      [6] => 6 
     ) 

    [7] => 11 
    [14] => Array 
     (
      [15] => 15 
      [16] => 16 
      [19] => 19 
      [20] => 20 
      [21] => 21 
     ) 

) 

वांछित/उम्मीद परिणाम है:

Array 
(
    [1] => 1 
    [2] => Array 
     (
      [3] => 3 
      [6] => Array 
       (
        [10] => 4 // <-- array with n-levels... 
       ) 

     ) 

    [7] => 11 
    [14] => Array 
     (
      [15] => 15 
      [16] => 16 
      [19] => 19 
      [20] => 20 
      [21] => 21 
     ) 

) 

यहाँ link to codepad कि वर्ग और सरणी का परीक्षण करती है।

किसी भी मदद की बहुत सराहना की जाती है। धन्यवाद।

उत्तर

2

मुझे लगता है कि आप इस के लिए देख रहे हैं:

function collapse(&$array) { 
    foreach ($array as $k => &$v) { 
    if (array_key_exists('children', $v)) { 
     collapse($v['children']); 
     $array[$k] = $v['children']; 
    } else { 
     $array[$k] = $k; 
    } 
    } 
} 

जो, इस तरह कहा जाता है जब:

collapse($tree); 
print_r($tree); 

पैदा करता है:

Array (
    [1] => 1 
    [2] => Array (
      [3] => 3 
      [6] => Array (
        [10] => Array (
           [4] => 4 
          ) 
        ) 
     ) 
    [7] => Array (
      [11] => 11 
     ) 
    [14] => Array (
      [15] => 15 
      [16] => 16 
      [19] => 19 
      [20] => 20 
      [21] => 21 
     ) 
) 

आप के लिए http://codepad.org/8atfSWGC

+0

कुडोस देखें @Tomalak! आपका समाधान ठीक उसी आउटपुट में करता है जो मुझे अंतिम आउटपुट में चाहिए, भले ही संरचना मुझे अपेक्षाकृत थोड़ा अलग रूप है। यह उदाहरण वर्ग एक छीन लिया गया संस्करण है, लेकिन "पतन" समाधान पूरी तरह फिट बैठता है ... इसे समझना है कि कैसे और क्यों :) – verb8

+0

@ verb8 उपर्युक्त सही काम करता है, आपकी अपेक्षित संरचना गलत है। ध्यान दें कि यह समाधान मूल सरणी को संशोधित करता है। यदि आप इसे नहीं चाहते हैं, तो आपको फ़ंक्शन को अनुकूलित करना होगा। – Tomalak

+0

यहां क्लास विधि के रूप में फांसी कार्य है http://codepad.org/O3JV5rQe चीयर्स साथी :) – verb8

संबंधित मुद्दे