【问题标题】:Get array's key recursively and create underscore separated string递归获取数组键并创建下划线分隔的字符串
【发布时间】:2011-02-14 12:25:38
【问题描述】:

现在我得到了一个包含某种信息的数组,我需要从中创建一个表。例如

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

现在我想创建包含字段名称的数据库表:

Student_Address_StreetAddress
Student_Address_StreetName
Student_Marks1
Student_Marks2

它应该是递归的,因此它可以从任何深度的数组中创建我格式的字符串。

【问题讨论】:

标签: php arrays multidimensional-array


【解决方案1】:

您可以使用标准 PHP 库 (SPL) 中的 RecursiveArrayIteratorRecursiveIteratorIterator(递归迭代数组)使这项工作相对轻松。

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

【讨论】:

  • 您将如何修改您的代码以按正确的顺序获取字段名称,例如 'Student_Address_StreetAddress'?谢谢
【解决方案2】:

(正在处理,这里是数组来省事):

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

【讨论】:

  • $arr = array ( 'Student' => array ( 'Address' => array ( 'StreetAddress' => 'Some Street', 'StreetName' => 'Some Name', ), ' Marks1' => array(), 'Marks2' => '50', ), );将响应不需要的结果
【解决方案3】:

可能是这样的吗?

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

我知道全局变量不好,但现在想不出更好的了。

【讨论】:

    【解决方案4】:

    这样的工作:

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

    【讨论】:

    • +1,我有一些与此非常相似的东西(虽然我不知道它被称为 DFS),我面临的问题是在不使用全局变量或引用的情况下返回数组。
    • $arr = array ( 'Student' => array ( 'Address' => array ( 'StreetAddress' => 'Some Street', 'StreetName' => 'Some Name', ), ' Marks1' => array(), 'Marks2' => '50', ), );将响应不需要的结果
    【解决方案5】:
    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;
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 2021-12-31
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多