2010-09-10 13 views
33

मेरे पास एक नेस्टेड सरणी है जिसमें मैं परिणामों का सबसेट प्रदर्शित करना चाहता हूं। उदाहरण के लिए, नीचे दिए गए सरणी पर मैं नेस्टेड सरणी [1] में सभी मानों के माध्यम से लूप करना चाहता हूं।नेस्टेड ऐरे के साथ PHP foreach?

 
Array 
(
    [0] => Array 
    (
     [0] => one 
     [1] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 3 
     ) 
    ) 

    [1] => Array 
    (
     [0] => two 
     [1] => Array 
     (
      [0] => 4 
      [1] => 5 
      [2] => 6 
     ) 
    ) 

    [2] => Array 
    (
     [0] => three 
     [1] => Array 
     (
      [0] => 7 
      [1] => 8 
      [2] => 9 
     ) 
    ) 
) 

मैं foreach फ़ंक्शन का उपयोग करने की कोशिश कर रहा था लेकिन मुझे यह काम करने के लिए प्रतीत नहीं होता है। यह मेरा मूल वाक्यविन्यास था (हालांकि मुझे एहसास हुआ कि यह गलत है)।

 
$tmpArray = array(array("one",array(1,2,3)),array("two",array(4,5,6)),array("three",array(7,8,9))); 

foreach ($tmpArray[1] as $value) { 
    echo $value; 
} 

मैं एक चर कि क्या कुंजी कुंजी मैं खोज करना चाहते हैं के रूप में ही है पर तुलना से बचने के लिए कोशिश कर रहा था, अर्थात

 
foreach ($tmpArray as $key => $value) { 
    if ($key == 1) { 
    echo $value; 
    } 
} 

कोई भी विचार?

+0

आपका आंतरिक वाक्यविन्यास ठीक लगता है, लेकिन '$ value'' foreach' में स्वयं एक सरणी हो सकता है। उस स्थिति में आप इसे केवल गूंज नहीं सकते हैं, लेकिन आपको इसके माध्यम से भी लूप करना होगा। – Fanis

उत्तर

51

यदि आप नेस्टेड सरणी में स्तरों की संख्या जानते हैं तो आप केवल नेस्टेड लूप कर सकते हैं। इस तरह:

// Scan through outer loop 
foreach ($tmpArray as $innerArray) { 
    // Check type 
    if (is_array($innerArray)){ 
     // Scan through inner loop 
     foreach ($innerArray as $value) { 
      echo $value; 
     } 
    }else{ 
     // one, two, three 
     echo $innerArray; 
    } 
} 

यदि आपको सरणी की गहराई नहीं पता है तो आपको रिकर्सन का उपयोग करने की आवश्यकता है। नीचे दिए गए उदाहरण देखें:

// Multi-dementional Source Array 
$tmpArray = array(
    array("one", array(1, 2, 3)), 
    array("two", array(4, 5, 6)), 
    array("three", array(
      7, 
      8, 
      array("four", 9, 10) 
    )) 
); 

// Output array 
displayArrayRecursively($tmpArray); 

/** 
* Recursive function to display members of array with indentation 
* 
* @param array $arr Array to process 
* @param string $indent indentation string 
*/ 
function displayArrayRecursively($arr, $indent='') { 
    if ($arr) { 
     foreach ($arr as $value) { 
      if (is_array($value)) { 
       // 
       displayArrayRecursively($value, $indent . '--'); 
      } else { 
       // Output 
       echo "$indent $value \n"; 
      } 
     } 
    } 
} 

अपने विशिष्ट मामले के लिए मूल्यों के साथ प्रदर्शन केवल नेस्टेड सरणी के साथ नीचे कोड (केवल 3 स्तर)

$tmpArray = array(
    array("one", array(1, 2, 3)), 
    array("two", array(4, 5, 6)), 
    array("three", array(7, 8, 9)) 
); 

// Scan through outer loop 
foreach ($tmpArray as $inner) { 

    // Check type 
    if (is_array($inner)) { 
     // Scan through inner loop 
     foreach ($inner[1] as $value) { 
      echo "$value \n"; 
     } 
    } 
} 
+0

के लिए आपूर्ति की गई अवैध तर्क मुझे लगता है कि आप मेरी बात याद कर चुके हैं, मैं केवल एक विशिष्ट नेस्टेड/उप सरणी प्रदर्शित करना चाहता हूं, न कि उन सभी को। – noangel

+0

@noangel गलतफहमी के लिए खेद है, क्षैतिज नियम के बाद संशोधित पोस्ट (अंतिम भाग) देखें। यह चीजों को स्पष्ट करना चाहिए। – Alex

+0

मैंने आपके रिकर्सिव सरणी आउटपुट कार्यान्वयन की कोशिश की और हालांकि यह पहले स्तर के लिए काम करता है, मेरा आखिरी घोंसला वाला सरणी केवल एक पंक्ति पर आउटपुट था – myol

2

दोनों वाक्यविन्यास सही हैं। लेकिन परिणाम Array होगा। आप शायद इस तरह कुछ करना चाहता हूँ:

foreach ($tmpArray[1] as $value) { 
    echo $value[0]; 
    foreach($value[1] as $val){ 
    echo $val; 
    } 
} 

इस स्ट्रिंग बाहर प्रिंट होगा "दो" ($ मूल्य [0]) और पूर्णांक 4, 5 और 6 सरणी से ($ मूल्य [1]) ।

+0

मुझे केवल त्रुटि मिलती है: चेतावनी: foreach() – noangel

1
foreach ($tmpArray as $innerArray) { 
    // Check type 
    if (is_array($innerArray)){ 
     // Scan through inner loop 
     foreach ($innerArray as $value) { 
      echo $value; 
     } 
    }else{ 
     // one, two, three 
     echo $innerArray; 
    } 
} 

बिल्कुल सही मेरे लिए काम किया ... इस

0

इस डेटा के बारे में:

[0] => Array (
    [item] => null 
    [count] => 0 
    [child] => Array (
     [1] => Array (
      [item] => 1 
      [count] => 6 
      [child] => Array (
       [5] => Array (
        [item] => 5 
        [count] => 3 
        [child] => Array (
         [4] => Array (
          [item] => 4 
          [count] => 1 
          ) 
         ) 
        ) 
       [3] => Array (
        [item] => 3 
        [count] => 2 
        [child] => Array (
         [4] => Array (
          [item] => 4 
          [count] => 1 
          ) 
         ) 
        ) 
       ) 
      ) 
     [3] => Array (
      [item] => 3 
      [count] => 1 
      [child] => Array (
       [4] => Array (
        [item] => 4 
        [count] => 1 
        ) 
       ) 
      ) 
     ) 
    ) 

क्या आप सभी मार्ग प्राप्त कर सकते हैं? डेटा एक बाइनरी पेड़ की तरह दिखता है। कुछ की आवश्यकता है

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