2015-05-21 11 views
24

उदाहरण के साथ शीर्षक कहता है, मैं पिछले मान के रूप में प्रत्येक निम्न कुंजी द्वारा घोंसला करने के लिए एक फ्लैट सरणी की आवश्यकता है।PHP फ्लैट सरणी को नेस्टेड ["ए", "बी", "सी"] से ["ए" => ["बी" => ["सी"]]]

उदाहरण:

function make_nested($array) { 
    if (!$array) 
     return array(); 
    $result = array(array_pop($array)); 
    while ($array) 
     $result = array(array_pop($array) => $result); 
    return $result; 
} 

उत्तर

5

यहाँ एक कि सिर्फ मूल सरणी के बजाय बदल एक नया वेरिएबल बनाने array_walk का उपयोग करने का है:

$a = ["I", "need", "this", "to", "be", "nested"]; 
array_walk(array_reverse($a), function ($v, $k) use (&$a) { 
    $a = $k ? [$v => $a] : [$v]; 
}); 

तो $a खाली है, यह सिर्फ यह के रूप में खाली छोड़ देना चाहिए । हालांकि, यह मानता है कि आपके इनपुट सरणी में 0

+0

यह सही है! हालांकि मैंने एक जगह बदलने के लिए नहीं कहा था, यह सबसे कॉम्पैक्ट संस्करण प्रतीत होता है, जिसे मैं वास्तव में ढूंढ रहा था। –

+0

@DeadManWalker, वास्तव में यह सबसे कॉम्पैक्ट संस्करण नहीं है। यहां [मेरे उत्तर] से पहले फ़ंक्शन की वर्तनी है (http://stackoverflow.com/a/30365085/2266855): 'फ़ंक्शन एमएन ($ ए) {वापसी गणना ($ ए) <2? $ ए: [array_shift ($ ए) => एमएन ($ ए)]; } '। इसके अलावा मेरा काम अधिक कुशल है। – dened

23

यहाँ एक संभव कार्यान्वयन है for - इसके लिए लॉग इन करें :)

$array = array("I", "need", "this", "to", "be", "nested"); 

$newArray[$array[count($array)-2]] = array_pop($array); 

for($i = count($array) - 2; $i > -1; $i--) { 
    $newArray[$array[$i]] = $newArray; 
    unset($newArray[$array[$i+1]]); 
} 

print_r($newArray); 
4

मैं का प्रयोग करेंगे:

<?php 

function make_nested($array) { 
    if (count($array) < 2) 
     return $array; 
    $key = array_shift($array); 
    return array($key => make_nested($array)); 
} 

print_r(make_nested(array("I", "need", "this", "to", "be", "nested"))); 

आप प्रत्यावर्तन पसंद नहीं है, यहाँ एक सतत संस्करण है:

array("I", "need", "this", "to", "be", "nested"); 
// To: 
array("I" => array("need" => array("this" => array("to" => array("be" => array("nested")))))) 
1

ऐसा लगता है कि यह काम कर रहा है।

$a = array("I", "need", "this", "this", "to", "be", "nested"); 
$r = array($a[sizeof($a) - 1]); 
for ($i=sizeof($a)-2; $i >= 0; $i--) { 
    $r = array($a[$i] => $r); 
} 
echo($ar == $r); 
3

Run The Code

<?php 

    // nested_array(array, start_index, length) 
    function nested_array($arr, $i, $size) 
    { 
     if ($i == ($size-1)) 
     { 
      return array($arr[$i] => array()); 
     } 
     return array($arr[$i] => nested_array($arr,($i+1),$size)); 
    } 

    print_r(nested_array(array("I", "need", "this", "to", "be", "nested"),0,6)); 

?> 
+4

से शुरू होने वाली चाबियां हैं। ओपी चाहता था कि उनकी आंतरिक सरणी 'सरणी "(" हो "=> सरणी (" नेस्टेड ")) की तरह दिखें,' आपका कोड 'ऐरे' [होना] => नेस्टेड) ​​'। मुझे लगता है कि एक खाली सरणी अधिक समझ में आएगी, वैसे: '["हो" => ["नेस्टेड" => []]] '। – Kobi

+0

@ कोबी नोट निश्चित –

17

array_reduce का उपयोग करना:

$a = ["I", "need", "this", "to", "be", "nested"]; 

$result = array_reduce(array_reverse($a), function($prevArray, $key){ 
    return $prevArray ? [$key => $prevArray] : [$key]; 
}, null); 

ध्यान दें कि हम array_reverse उपयोग कर रहे हैं क्योंकि न एक बाएं को कम नहीं होती है।

कार्य उदाहरण: http://ideone.com/N61VtE

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