php

2015-07-06 2 views
5

में एकल सरणी को बहुआयामी सरणी में कनवर्ट करें यदि कोई समस्या है तो मैं कुछ घंटों को हल करने का प्रयास करता हूं, लेकिन बस समाधान नहीं ढूंढ सकता।php

तो रास्तों

$singleArray = array(
    '/Web', 
    '/Web/Test1', 
    '/Web/Test2', 
    '/Web/Test2/Subfolder', 
    '/Web/Test3', 
    '/Public' 
); 

कि सरणी मैं एक mulitdimensional सरणी, जो चाबियाँ रहता है बनाना चाहते हैं, लेकिन सही पेरेंट फ़ोल्डर में सबफ़ोल्डर डाल से की एक सारिणी। बाद में मैं नई सरणी एक फ़ोल्डर ट्री बनाने के लिए अधिक लूप करना चाहते हैं (लेकिन एक समस्या नहीं thats)

नई सरणी इस तरह दिखना चाहिए:

$multiArray = array(
    '/Web'=>array(
     '/Web/Test1'=>array(), 
     '/Web/Test2'=>array(
      '/Web/Test2/Subfolder'=>array() 
    ), 
     '/Web/Test3'=>array() 
    ), 
    '/Public'=>array() 
); 
+0

मैं वोट डाल नहीं था, लेकिन यह एक सवाल तर्क चरणों के लिए पूछ रहा है शामिल? या बस ओपी के लिए कोड लिखने का अनुरोध? – SnoApps

+0

एक अच्छा जवाब तर्क देगा और शायद कोड का उपयोग करके ऐसा कर सकता है (क्योंकि यह छद्म कोड या फ़्लोचार्ट्स से देखने के लिए अच्छा है) – jcuenod

+0

मुझे पता नहीं है कि आप किस बारे में शिकायत कर रहे हैं। यह एक कानूनी सवाल है। उत्तर छद्म कोड में हो सकता है जिसे आप जानते हैं। – Andrew

उत्तर

5

कोड नीचे सरणी आप चाहते हैं कर देगा। आपकी समस्या को हल करने की कुंजी प्रत्येक पुनरावृत्ति सरणी के संदर्भ को बनाना है।

<?php 
$singleArray = array(
    '/Web', 
    '/Web/Test1', 
    '/Web/Test2', 
    '/Web/Test2/Subfolder', 
    '/Web/Test3', 
    '/Public' 
); 

$multiArray = array(); 

foreach ($singleArray as $path) { 
    $parts  = explode('/', trim($path, '/')); 
    $section  = &$multiArray; 
    $sectionName = ''; 

    foreach ($parts as $part) { 
     $sectionName .= '/' . $part; 

     if (array_key_exists($sectionName, $section) === false) { 
      $section[$sectionName] = array(); 
     } 

     $section = &$section[$sectionName]; 
    } 
} 
+0

बहुत बहुत धन्यवाद। यह एक आकर्षक की तरह काम करता है। मुझे लगता है कि मेरी समस्या यह है कि मैंने संदर्भों को सही ढंग से नहीं समझा। मुझे लगता है कि मुझे इसके बारे में दस्तावेज और ट्यूटोरियल में डिपर खोदना है। लेकिन सबसे पहले मैं यह समझने के लिए कोड को डीबग करने का प्रयास करूंगा कि क्या हो रहा है;) – devops21212

+0

अच्छा समाधान, मैं आपके भीतर के 'foreach' के बजाय एक रिकर्सिव फ़ंक्शन पसंद करता हूं। – jcuenod

0

यह काम कर रहा है! महान चुनौती!

सबसे पहले मैं सरणी को फ़ोल्डर्स की संख्या से सॉर्ट करता हूं, ताकि संसाधित होने वाले पहले को कम फ़ोल्डर (रूट में) वाले लोग हैं।

फिर फ़ंक्शन प्रत्येक आइटम आइटम और उस आइटम में प्रत्येक फ़ोल्डर के माध्यम से पुनरावृत्त करता है, इसे सरणी में मौजूदा आइटम से तुलना करता है, और यदि यह मौजूद है, तो उसे उस आइटम के अंदर एक बहुआयामी सरणी के रूप में रखें।

यह दो उपफोल्डर्स -/रूट/उप 1/उप 2 के लिए काम करेगा - लेकिन यह गहरा उपयोग के लिए कार्यक्षमता जोड़ने के लिए काफी सरल है।

यह नमूना कोड भी बाहर प्रिंट से पहले/सरणियों के बाद:

$singleArray = array(
    '/Web', 
    '/Web/Test1', 
    '/Web/Test2', 
    '/Web/Test2/Subfolder', 
    '/Web/Test3', 
    '/Public' 
); 


echo "<pre>"; 
print_r($singleArray); 

$multiArray = array(); 


//first sort array by how many folders there are so that root folders are processed first 
usort($singleArray, function($a, $b) { 

    $a_folders = explode("/", $a); 
    $b_folders = explode("/", $b); 

    $a_num = count($a_folders); //number of folders in first 
    $b_num = count($b_folders); //number of folders in second 

    if($a_num > $b_num) return -1; 
    elseif($a_num < $b_num) return 1; 
    else return 0; 

}); 

//foreach in array 
foreach($singleArray as $item){ 

    //get names of folders 
    $folders = explode("/", $item); 

    //if the first folder exists 
    if(in_array($folders[0], $multiArray)){ 

     $key1 = array_search($folders[0], $multiArray); 

     //repeat for subfolder #1 
     if(in_array($folders[1], $multiArray[$key1])){ 

      $key2 = array_search($folders[1], $multiArray[$key1]); 

      //repeat for subfolder #2 
      if(in_array($folders[2], $multiArray[$key1][$key2])){ 

       $key3 = array_search($folders[2], $multiArray[$key1][$key2]); 

       array_push($multiArray[$key1][$key2][$key3], $item); 

      } else array_push($multiArray[$key1][$key2], $item); 

     } else array_push($multiArray[$key1], $item); 

    } else array_push($multiArray, $item); 

} 

//reverse the array so that it looks nice 
$multiArray = array_reverse($multiArray); 

print_r($multiArray); 

हो जाएगा ताकि उत्पादन:

Array 
(
    [0] => /Web 
    [1] => /Web/Test1 
    [2] => /Web/Test2 
    [3] => /Web/Test2/Subfolder 
    [4] => /Web/Test3 
    [5] => /Public 
) 
Array 
(
    [0] => /Web 
    [1] => /Public 
    [2] => /Web/Test1 
    [3] => /Web/Test2 
    [4] => /Web/Test3 
    [5] => /Web/Test2/Subfolder 
) 
+0

आपके उत्तर के लिए धन्यवाद। ईमानदार होने के लिए मुझे पहले एक शांत समान समाधान था। लेकिन जैसा कि आपने बताया: यह केवल दूसरे उपफोल्डर तक काम करता है। लेकिन मैं आपके कोड का थोड़ा सा उपयोग करने की कोशिश करूंगा और अधिक सबफ़ोल्डर का उपयोग करने के लिए इसे ट्वीक करूँगा;) – devops21212

+0

कोई चिंता नहीं - मुझे इस काम को करने का प्रयास करने का आनंद लिया! – Ben

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

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