2010-05-01 4 views
9

बनाएं अभी अभी मुझे एक सरणी मिली है जिसमें कुछ प्रकार की जानकारी है और मुझे इससे एक टेबल बनाने की आवश्यकता है। जैसेसरणी की कुंजी को दोबारा प्राप्त करें और अंडरस्कोर अलग स्ट्रिंग

Student{ 
     [Address]{ 
       [StreetAddress] =>"Some Street" 
       [StreetName] => "Some Name" 
     } 
     [Marks1] => 100 
     [Marks2] => 50 
    } 

अब मैं डेटाबेस तालिका जो जैसे क्षेत्रों को शामिल बनाना चाहते हैं के रूप में नाम:

Student_Address_StreetAddress 
Student_Address_StreetName 
Student_Marks1 
Student_Marks2 

यह पुनरावर्ती होना चाहिए ताकि सरणी के किसी भी गहराई से यह मेरी प्रारूप में स्ट्रिंग बना सकते हैं।

+2

आपको कम से कम पीएचपी प्रारूप में सरणी प्रदान की किया जा सकता था:

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr)); $keys = array(); foreach ($iterator as $key => $value) { // Build long key name based on parent keys for ($i = $iterator->getDepth() - 1; $i >= 0; $i--) { $key = $iterator->getSubIterator($i)->key() . '_' . $key; } $keys[] = $key; } var_export($keys); 

ऊपर के उदाहरण की तरह कुछ आउटपुट। –

+0

डीएफएस जानने के लिए काफी आसान है: http://en.wikipedia.org/wiki/Depth-first_search – polygenelubricants

उत्तर

8

(इस पर काम करते हुए, यहाँ मुसीबत को बचाने के लिए सरणी है):

$arr = array 
(
    'Student' => array 
    (
     'Address' => array 
     (
      'StreetAddress' => 'Some Street', 
      'StreetName' => 'Some Name', 
     ), 
     'Marks1' => '100', 
     'Marks2' => '50', 
    ), 
); 

यहाँ यह, @polygenelubricants कोड का एक संशोधित संस्करण उपयोग कर रहा है:

function dfs($array, $parent = null) 
{ 
    static $result = array(); 

    if (is_array($array) * count($array) > 0) 
    { 
     foreach ($array as $key => $value) 
     { 
      dfs($value, $parent . '_' . $key); 
     } 
    } 

    else 
    { 
     $result[] = ltrim($parent, '_'); 
    } 

    return $result; 
} 

echo '<pre>'; 
print_r(dfs($arr)); 
echo '</pre>'; 

आउटपुट :

Array 
(
    [0] => Student_Address_StreetAddress 
    [1] => Student_Address_StreetName 
    [2] => Student_Marks1 
    [3] => Student_Marks2 
) 
+0

$ आगमन = सरणी ( 'छात्र' => सरणी ( 'पते' => सरणी ( ' StreetAddress '=>' कुछ स्ट्रीट ', ' StreetName '=>' कुछ नाम ', ), ' Marks1 '=> सरणी(), ' Marks2 '=>' 50 ', ), ); प्रतिक्रिया अवांछित परिणाम – Nehal

+0

@Nehal: मैंने इसे अपडेट किया है, इसे आजमाएं। –

1

कुछ शायद यह पसंद है?

$schema = array(
    'Student' => array(
     'Address' => array(
      'StreetAddresss' => "Some Street", 
      'StreetName' => "Some Name", 
     ), 
     'Marks1' => 100, 
     'Marks2' => 50, 
    ), 
); 

$result = array(); 

function walk($value, $key, $memo = "") { 
    global $result; 
    if(is_array($value)) { 
     $memo .= $key . '_'; 
     array_walk($value, 'walk', $memo); 
    } else { 
     $result[] = $memo . $key; 
    } 
} 

array_walk($schema, 'walk'); 

var_dump($result); 

मुझे पता है कि ग्लोबल्स खराब हैं, लेकिन अब कुछ बेहतर नहीं सोच सकते हैं।

1

कुछ इस तरह काम करता है:

<?php 

$arr = array (
    'Student' => array (
    'Address' => array (
     'StreetAddress' => 'Some Street', 
     'StreetName' => 'Some Name', 
    ), 
    'Marks1' => array(), 
    'Marks2' => '50', 
), 
); 

$result = array(); 

function dfs($data, $prefix = "") { 
    global $result; 

    if (is_array($data) && !empty($data)) { 
     foreach ($data as $key => $value) { 
     dfs($value, "{$prefix}_{$key}"); 
     } 
    } else { 
     $result[substr($prefix, 1)] = $data; 
    } 
} 

dfs($arr); 
var_dump($result); 

?> 

This prints:

array(4) { 
    ["Student_Address_StreetAddress"] => string(11) "Some Street" 
    ["Student_Address_StreetName"] => string(9) "Some Name" 
    ["Student_Marks1"] => array(0) {} 
    ["Student_Marks2"] => string(2) "50" 
} 
+0

+1, मेरे पास कुछ ऐसा ही है (हालांकि मुझे नहीं पता था कि इसे डीएफएस कहा जाता था), मुझे जिस समस्या का सामना करना पड़ रहा है वह ग्लोबल्स या संदर्भों का उपयोग किए बिना सरणी को वापस करना है। –

+0

$ arr = array ('student' => array ('पता' => सरणी ('स्ट्रीट एड्रेस' => 'कुछ स्ट्रीट', 'स्ट्रीटनाम' => 'कुछ नाम',), 'मार्क्स 1' => सरणी() , 'मार्क्स 2' => '50',),); अवांछित परिणाम प्रतिक्रिया देगा – Nehal

+0

@Nehal: नवीनतम संस्करण देखें। – polygenelubricants

0
function getValues($dataArray,$strKey="") 
{ 
    global $arrFinalValues; 

    if(is_array($dataArray)) 
    { 
     $currentKey = $strKey; 
     foreach($dataArray as $key => $val) 
     { 
      if(is_array($val) && !empty($val)) 
      { 
       getValues($val,$currentKey.$key."_"); 
      } 
      else if(!empty($val)) 
      { 
       if(!empty($strKey)) 
        $strTmpKey = $strKey.$key; 
       else 
        $strTmpKey = $key; 
       $arrFinalValues[$strTmpKey]=$val; 
      } 
     } 
    } 
} 
16

आप मानक PHP संग्रहालय से RecursiveArrayIterator और RecursiveIteratorIterator उपयोग कर सकते हैं (रिकर्सिवली सरणी पर पुनरावृति करने के लिए) (SPL) इस काम को अपेक्षाकृत दर्द रहित बनाने के लिए।

array (
    0 => 'Student_Address_StreetAddress', 
    1 => 'Student_Address_StreetName', 
    2 => 'Student_Marks1', 
    3 => 'Student_Marks2', 
) 
+0

सही क्रम में फ़ील्ड नाम प्राप्त करने के लिए आप अपना कोड कैसे संशोधित करेंगे, यानी।उदाहरण के लिए 'Student_Address_StreetAddress''? धन्यवाद –

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