Получить массив массива рекурсивно и создать выделенную строку подчеркивания

Прямо сейчас у меня есть массив, который имеет некоторую информацию, и мне нужно создать таблицу из нее. например

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

Теперь я хочу создать таблицу базы данных, которая содержит имя полей как:

 Student_Address_StreetAddress Student_Address_StreetName Student_Marks1 Student_Marks2 

Он должен быть рекурсивным, поэтому из любой глубины массива он может создать строку в моем формате.

Вы можете использовать RecursiveArrayIterator и RecursiveIteratorIterator (для итерации по массиву рекурсивно) из стандартной библиотеки PHP ( SPL ), чтобы сделать эту работу относительно безболезненной.

 $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); 

Вышеприведенный пример выводит что-то вроде:

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

(Работая над этим, вот массив, чтобы сохранить проблемы):

 $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 ) 

Что-то вроде этого, может быть?

 $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); 

Я знаю, что глобалы плохие, но теперь не могу придумать ничего лучшего.

Что-то вроде этого работает:

 <?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); ?> 

Это печатает :

 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" } 
 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; } } } }