Php 获取数组';s键,并创建下划线分隔的字符串
现在我得到了一个数组,其中包含一些信息,我需要从中创建一个表。e、 gPhp 获取数组';s键,并创建下划线分隔的字符串,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,现在我得到了一个数组,其中包含一些信息,我需要从中创建一个表。e、 g Student{ [Address]{ [StreetAddress] =>"Some Street" [StreetName] => "Some Name" } [Marks1] => 100 [Marks2] => 50 } 现在,我想创建一个数据库表,其中包含字段名,如下所示: St
Student{
[Address]{
[StreetAddress] =>"Some Street"
[StreetName] => "Some Name"
}
[Marks1] => 100
[Marks2] => 50
}
现在,我想创建一个数据库表,其中包含字段名,如下所示:
Student_Address_StreetAddress
Student_Address_StreetName
Student_Marks1
Student_Marks2
它应该是递归的,因此从数组的任何深度,它都可以以我的格式创建字符串。(处理它,这里是避免麻烦的数组):
在这里,使用@Polygene代码的修改版本:
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>';
也许是这样的
<?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);
?>
我知道globals很糟糕,但现在想不出比它更好的了。像这样的方法很有效:
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"
}
您可以使用标准PHP库()中的和(递归地迭代数组),使这项工作相对轻松
array (
0 => 'Student_Address_StreetAddress',
1 => 'Student_Address_StreetName',
2 => 'Student_Marks1',
3 => 'Student_Marks2',
)
上面的示例输出如下内容:
您至少可以提供PHP格式的数组。DFS非常容易学习:+1,我有一些非常类似的东西(虽然我不知道它被称为DFS),我面临的问题是在不使用全局变量或引用的情况下返回数组。$arr=array('Student'=>array('Address'=>array)('StreetAddress'=>'Some Street','StreetName'=>'Some Name',),'Marks1'=>array(),'Marks2'=>'50',);将响应不需要的结果$arr=array('Student'=>array('Address'=>array('StreetAddress'=>'Some Street','StreetName'=>'Some Name',),'Marks1=>array(),“Marks2'=>“50',),);将响应不需要的结果您如何修改代码以获得正确顺序的字段名,例如,
“学生地址”
,谢谢
<?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;
}
}
}
}
$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',
)