Php 如果数组元素满足条件,请重新排列它们
阵列:Php 如果数组元素满足条件,请重新排列它们,php,arrays,sorting,Php,Arrays,Sorting,阵列: array( '354' => array( 'parent' => 0 ), '370' => array( 'parent' => 0 ), '420' => array( 'parent' => 354 ), ) 如何移动具有“父级”值的所有元素!=0,就在键与父值相同的元素之后
array(
'354' => array(
'parent' => 0
),
'370' => array(
'parent' => 0
),
'420' => array(
'parent' => 354
),
)
如何移动具有“父级”值的所有元素!=0,就在键与父值相同的元素之后
例如,上面带有420个键的元素需要跟随带有354键的元素…这在一般情况下是不可能的。在您的示例中,它会起作用 但这里还有另一个例子:
Number | Parent
10 | 1
11 | 1
100 | 10
101 | 10
102 | 10
1000 | 100
1001 | 100
因此,您希望所有三行100
,101
,102
都直接位于行10
之后,这是不可能的
在行100
和101
之间,您可能需要行1000
和1001
,因为它们的父行是100
[更新]
因此,仍然存在以下问题:
- 您是否只需要对节点进行排序,以便在将每个节点用作父节点之前将其定义在某个位置
- 直接子节点是否必须直接跟随其父节点,或者中间可能有其他节点
- 父ID是否总是小于节点ID
- 在一般情况下,这是不可能的。在您的示例中,它会起作用
但这里还有另一个例子:
Number | Parent
10 | 1
11 | 1
100 | 10
101 | 10
102 | 10
1000 | 100
1001 | 100
因此,您希望所有三行100
,101
,102
都直接位于行10
之后,这是不可能的
在行100
和101
之间,您可能需要行1000
和1001
,因为它们的父行是100
[更新]
因此,仍然存在以下问题:
- 您是否只需要对节点进行排序,以便在将每个节点用作父节点之前将其定义在某个位置
- 直接子节点是否必须直接跟随其父节点,或者中间可能有其他节点
- 父ID是否总是小于节点ID
<?php
$array = array(
'354' => array(
'parent' => 0
),
'370' => array(
'parent' => 0
),
'420' => array(
'parent' => 354
),
'550' => array(
'parent' => 420
),
);
/**
*
* This function will convert a flat array with elements to the proper hierarchy structure
* @param array $array
*/
function hierarchy(&$array) {
arsort($array);
foreach($array as $key => $value)
{
if($value['parent'])
{
$array[$value['parent']]['children'][$key] = $value;
unset($array[$key]);
}
}
asort($array);
return $array;
}
(print '<pre>' . print_r(hierarchy($array), true) . '</pre>');
也许您正在寻找一种使平面数组具有某种层次结构的方法
这是一个非常简单的案例,它可以让你的孩子比他们的父母拥有更高的id
<?php
$array = array(
'354' => array(
'parent' => 0
),
'370' => array(
'parent' => 0
),
'420' => array(
'parent' => 354
),
'550' => array(
'parent' => 420
),
);
/**
*
* This function will convert a flat array with elements to the proper hierarchy structure
* @param array $array
*/
function hierarchy(&$array) {
arsort($array);
foreach($array as $key => $value)
{
if($value['parent'])
{
$array[$value['parent']]['children'][$key] = $value;
unset($array[$key]);
}
}
asort($array);
return $array;
}
(print '<pre>' . print_r(hierarchy($array), true) . '</pre>');
hm。。你为什么说这是不可能的?我只是想重新安排阵列。。。父值将始终指向现有的元素键。好吧,要么我不理解您的问题,要么您的示例太简单。您希望如何安排我的示例?有不止一个可能的解决方案,我不确定你想要哪一个。这就是我想要的:)所有三个元素都有键100、101、102,以跟随键10的元素。是的,1000和1001在100之后:)我不知道是否可以像某人发布的那样使用uasort,看起来你需要递归或其他什么…如果父id总是小于数组键,你可以简单地分两步对数组进行排序:首先按数组键(数字)排序,然后按父id(也按数字)排序。此外,我只是注意到我的例子也太简单了。详情见我的“答案”。嗯。。你为什么说这是不可能的?我只是想重新安排阵列。。。父值将始终指向现有的元素键。好吧,要么我不理解您的问题,要么您的示例太简单。您希望如何安排我的示例?有不止一个可能的解决方案,我不确定你想要哪一个。这就是我想要的:)所有三个元素都有键100、101、102,以跟随键10的元素。是的,1000和1001在100之后:)我不知道是否可以像某人发布的那样使用uasort,看起来你需要递归或其他什么…如果父id总是小于数组键,你可以简单地分两步对数组进行排序:首先按数组键(数字)排序,然后按父id(也按数字)排序。此外,我只是注意到我的例子也太简单了。请参阅我的“答案”了解详细信息。但是它们的数组应该保持平坦,然后可能您正在寻找类似这样的内容:php中的自定义排序,尽管您的函数希望保持平坦,但是它们的数组应该保持平坦,然后可能您正在寻找类似这样的内容:php中的自定义排序,尽管您的函数希望