2010-05-01 5 views
9

Ahora mismo tengo una matriz que tiene algún tipo de información y necesito crear una tabla a partir de ella. p.ej.Obtiene la clave de matriz de forma recursiva y crea una cadena separada de subrayado

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

Ahora quiero crear la tabla de base de datos como la que contiene los campos de nombre como:

Student_Address_StreetAddress 
Student_Address_StreetName 
Student_Marks1 
Student_Marks2 

Debe ser recursiva por lo que desde cualquier profundidad de la matriz se puede crear la cadena en mi formato.

+2

Al menos podría haber proporcionado la matriz en formato PHP. –

+0

DFS es muy fácil de aprender: http://en.wikipedia.org/wiki/Depth-first_search – polygenelubricants

Respuesta

8

(Trabajando en ello, aquí es la matriz de ahorrar la molestia):

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

Aquí está, utilizando una versión modificada del código @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>'; 

Salidas :

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

$ arr = array ( 'Estudiante' => array ( 'Dirección' => array ( ' StreetAddress' => 'Algunos Street', 'StreetName' => 'Algunos Nombre', ), 'Marks1' => array(), 'marks2' => '50', ), ); responderá al resultado no deseado – Nehal

+0

@Nehal: lo he actualizado, pruébelo ahora. –

1

Algo como este tal vez?

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

Sé que los globales son malos, pero no se me ocurre nada mejor ahora.

1

Algo como esto funciona:

<?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, tengo algo muy similar a esto (aunque no tenía idea de que se llamaba DFS), el problema que estoy enfrentando es devolver la matriz sin usar referencias globales o referencias. –

+0

$ arr = array ('Student' => array ('Dirección' => array ('StreetAddress' => 'Some Street', 'StreetName' => 'Some Name',), 'Marks1' => array() , 'Marks2' => '50',),); responderá al resultado no deseado – Nehal

+0

@Nehal: ver la última versión. – 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

Puede utilizar el RecursiveArrayIterator y la RecursiveIteratorIterator (para iterar sobre la matriz de forma recursiva) de la biblioteca estándar de PHP (SPL) para hacer que este trabajo sea relativamente sencillo.

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

el ejemplo anterior se da salida a algo como:

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

¿Cómo modificaría su código para obtener los nombres de los campos en el orden correcto, es decir''Student_Address_StreetAddress' por ejemplo? Gracias –

Cuestiones relacionadas