展平一个多维子数组,但保留依赖数组
Flatten a multi-dimensional array of children, but keep dependency array
我正在尝试为从 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
以及 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;
}
我正在尝试为从 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
以及 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;
}