php - 展平一个多维子数组,但保留依赖数组
问题描述
我正在尝试创建从 API 获得的结果的扁平数组。结果数组如下所示:
$arrayIhave = array(
'element name single' => array(
'__sort_name' => 'Name for sorting',
'id' => '1',
),
'element name single2' => array(
'__sort_name' => 'Name for sorting',
'id' => '2',
),
'element name with nested' => array(
'__sort_name' => 'Name for sorting',
'sub folder name' -> array(
'__sort_name' => 'Name for sorting',
'id' => '3',
),
'another sub folder' => array(
'__sort_name' => 'Name for sorting',
'id' => '4',
)
),
'element name with multi nested' => array(
'__sort_name' => 'Name for sorting',
'sub folder name' -> array(
'__sort_name' => 'Name for sorting',
'sub sub folder name' -> array(
'__sort_name' => 'Name for sorting',
'id' => '5',
),
),
),
'another sub folder' => array(
'__sort_name' => 'Name for sorting',
'id' => '6',
)
),
);
我试图安排的最后一个数组有一个每个元素的 id,它在树中给出了依赖项。因此,顶级项目id
对其所有子文件夹都有依赖关系,无论向下多少级。
树中的最后一个子文件夹仅对其子文件夹具有依赖性。依赖树不会使用 id,因为folders
没有它。
结果数组:
$arrayITryToHave = array(
'element name single' => array(),
'element name single2' => array(),
'element name with nested' => array(
'sub folder name',
),
'element name with multi nested' => array(
'sub folder name',
'sub sub folder name', // Note the dependency array is flat and has all levels flatten
'another sub folder',
),
'sub folder name' => array( // Even though a subfolder, it has dependencies too
'sub sub folder name',
),
);
我尝试使用array_walk_recursive
and with foreach
,array_column
但这在多层次上不起作用。我也尝试过使用常规的 foreach 和&$reference
数组,但是我无法将其添加sub sub folder
到上面的依赖项 1 级别,以及上面的另一个级别的依赖项。
目前使用的代码:
function generateArray(&$array, $iterate){
foreach($iterate as $key => $value){
$id = $key;
// Remove invalid elements
if(isset($value['__sort_name'])) unset($value['__sort_name']);
// If not present already, make an array
if(!isset($array[$id])){
$array[$id] = array();
}
array_push($array[$id], array_column($value, 'name', 'name'));
}
}
你会如何处理这个问题?
解决方案
好的,我已经设法通过这种方式解决了,如果有人有更好的方法,请告诉我:)
function generateCollapseFolder($returnArr){
$iterator = new \RecursiveIteratorIterator(
new \RecursiveArrayIterator($returnArr),
\RecursiveIteratorIterator::SELF_FIRST
);
$filtered = array();
$filteredLastArrayHelper = array();
foreach ($iterator as $key => $item) {
// Get if we are deep down
$currentDepth = $iterator->getDepth();
$isNested = $currentDepth > 0;
// We only care about this field
if($key === '__sort_name'){
if(!isset($filtered[$item])) $filtered[$item] = array();
// Remember last level with key to match
$filteredLastArrayHelper[$currentDepth] = $item;
if($isNested){
for ($x = $currentDepth - 1; $x >= 0; $x--) {
$insertKey = $filteredLastArrayHelper[$x];
if($insertKey){
array_push($filtered[$insertKey], $item);
}
}
} else {
// Reset the array
$filteredLastArrayHelper = array();
}
}
}
return $filtered;
}
推荐阅读
- eclipse - JSFF 语法着色
- mongodb - 在 MongoDB 故障转移期间,数据库操作需要几分钟才能完成
- ansible - 如何在 jinja2 ansible 中将嵌套字典保存为变量?
- c++ - iOS Metal着色器语言如何翻转float2中的值顺序?
- mysql - 每当输入新名称时,创建触发器以将 FirstName 和 LastName 组合到新列 FullName
- python - AWS:boto3 如何连接到 Amazon DynamoDB?
- python - Keras 无法找到线性凸问题的解决方案
- django - 如何动态更改 django 中的电子邮件设置
- firebase - 带有 Vuex 的 Firebase/Nuxt 模块使用身份验证中间件存储数据:为什么用户对象显示为空?
- python - ASPOSE 幻灯片 AMAZON Lambda 蟒蛇