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

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

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

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

Student_Address_StreetAddress
Student_Address_StreetName
Student_Marks1
Student_Marks2

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

11
задан Cœur 7 January 2017 в 17:28
поделиться

5 ответов

Вы можете использовать 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',
)
18
ответ дан 3 December 2019 в 03:17
поделиться
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;
            }
        }
    }
}
0
ответ дан 3 December 2019 в 03:17
поделиться

Может быть, что-то вроде этого?

$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
ответ дан 3 December 2019 в 03:17
поделиться

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

<?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"
}
1
ответ дан 3 December 2019 в 03:17
поделиться

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

$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
)
8
ответ дан 3 December 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: