PHP按id和父id排序数组

PHP按id和父id排序数组,php,arrays,sorting,parentid,Php,Arrays,Sorting,Parentid,为了这个问题,我搜索了很多: 我有一个数组: array( array('id' = '1'; 'parent' = '0'; 'title' = 'XXX1'); array('id' = '85'; 'parent' = '0'; 'title' = 'XXX2'); array('id' = '41'; 'parent' = '0'; 'title' = 'XXX2'); array('id' = '17'; 'parent' = '0'; 'title' = 'XXX3'

为了这个问题,我搜索了很多:

我有一个数组:

array(
  array('id' = '1'; 'parent' = '0'; 'title' = 'XXX1');
  array('id' = '85'; 'parent' = '0'; 'title' = 'XXX2');
  array('id' = '41'; 'parent' = '0'; 'title' = 'XXX2');
  array('id' = '17'; 'parent' = '0'; 'title' = 'XXX3');
  array('id' = '66'; 'parent' = '1'; 'title' = 'XXX4');
  array('id' = '92'; 'parent' = '1'; 'title' = 'XXX5');
  array('id' = '65'; 'parent' = '1'; 'title' = 'XXX6');
  array('id' = '45'; 'parent' = '41'; 'title' = 'XXX7');
  array('id' = '19'; 'parent' = '92'; 'title' = 'XXX8');
  array('id' = '101'; 'parent' = '45'; 'title' = 'XXX9');
  array('id' = '102'; 'parent' = '45'; 'title' = 'XXX10');
  array('id' = '103'; 'parent' = '19'; 'title' = 'XXX11');
  array('id' = '104'; 'parent' = '19'; 'title' = 'XXX12');
  array('id' = '105'; 'parent' = '19'; 'title' = 'XXX13');
);
我如何将其排序为:

  • 如果父项==0,则按ID
    排序,但如果有子项,则应紧跟在父项之后。如果孩子有了孩子,他们也应该紧跟在父母之后

  • 考虑父项=0的项目
    级别0,并且此id的每个子项都有级别1

  • 现在:
    如果级别=0,则应在标题前添加“-TITLE”。如果级别为2-“--TITLE”,如果级别为5-“--TITLE”


我有大约300张唱片,最高级别约为4。对于<5级,我不需要排序脚本,但是对于100级,我也需要排序脚本。

您这里的问题是,您有一个一维数组,它试图执行一些实际上要在树中显示的操作。这意味着,当您的孩子链接到家长时,家长应该知道自己的孩子是谁,但在这种情况下,他们不知道。因此,您可以将其放入一个新的数据结构中,或者构建一个递归函数来计算每种结构的父级

这是通过首先按ID全局排序来完成的。这将确保我们不需要进行任何其他排序,因为数组已经按照您想要的顺序(在每个级别)进行排序。然后,我们简单地依次获取每个级别,递归地查找该级别的项目并将其附加到列表中:

<?php

$dudzio = array(
  array('id' => 1, 'parent' => 0, 'title' => 'XXX1'),
  array('id' => 85, 'parent' => 0, 'title' => 'XXX2'),
  array('id' => 41, 'parent' => 0, 'title' => 'XXX2'),
  array('id' => 17, 'parent' => 0, 'title' => 'XXX3'),
  array('id' => 66, 'parent' => 1, 'title' => 'XXX4'),
  array('id' => 92, 'parent' => 1, 'title' => 'XXX5'),
  array('id' => 65, 'parent' => 1, 'title' => 'XXX6'),
  array('id' => 45, 'parent' => 41, 'title' => 'XXX7'),
  array('id' => 19, 'parent' => 92, 'title' => 'XXX8'),
  array('id' => 101, 'parent' => 45, 'title' => 'XXX9'),
  array('id' => 102, 'parent' => 45, 'title' => 'XXX10'),
  array('id' => 103, 'parent' => 19, 'title' => 'XXX11'),
  array('id' => 104, 'parent' => 19, 'title' => 'XXX12'),
  array('id' => 105, 'parent' => 19, 'title' => 'XXX13')
);

function sortDudzio($a, $b)
{
    // If you need to switch which way the values are sorted
    // switch the 1 and -1 around
    if($a['id'] > $b['id']) {
        return 1;
    } elseif($a['id'] < $b['id']) {
        return -1;
    } else {
        return 0;
    }
}

function getByParent($array, $id, $level)
{

    $orderedArray = array();

    foreach($array as $k=>$arr) {
        if($arr['parent'] == $id) {
            $arr['title'] = str_repeat('-', $level) . $arr['title'];
            $orderedArray[] = $arr;
            $children = getByParent($array, $arr['id'], $level + 1);
            foreach($children as $child) {
                $orderedArray[] = $child;
            }
        }
    }

    return $orderedArray;

}

usort($dudzio, 'sortDudzio');

print_r(getByParent($dudzio, 0, 0));

您这里的问题是,您有一个一维数组试图执行一些实际上要显示在树中的操作。这意味着,当您的孩子链接到家长时,家长应该知道自己的孩子是谁,但在这种情况下,他们不知道。因此,您可以将其放入一个新的数据结构中,或者构建一个递归函数来计算每种结构的父级

这是通过首先按ID全局排序来完成的。这将确保我们不需要进行任何其他排序,因为数组已经按照您想要的顺序(在每个级别)进行排序。然后,我们简单地依次获取每个级别,递归地查找该级别的项目并将其附加到列表中:

<?php

$dudzio = array(
  array('id' => 1, 'parent' => 0, 'title' => 'XXX1'),
  array('id' => 85, 'parent' => 0, 'title' => 'XXX2'),
  array('id' => 41, 'parent' => 0, 'title' => 'XXX2'),
  array('id' => 17, 'parent' => 0, 'title' => 'XXX3'),
  array('id' => 66, 'parent' => 1, 'title' => 'XXX4'),
  array('id' => 92, 'parent' => 1, 'title' => 'XXX5'),
  array('id' => 65, 'parent' => 1, 'title' => 'XXX6'),
  array('id' => 45, 'parent' => 41, 'title' => 'XXX7'),
  array('id' => 19, 'parent' => 92, 'title' => 'XXX8'),
  array('id' => 101, 'parent' => 45, 'title' => 'XXX9'),
  array('id' => 102, 'parent' => 45, 'title' => 'XXX10'),
  array('id' => 103, 'parent' => 19, 'title' => 'XXX11'),
  array('id' => 104, 'parent' => 19, 'title' => 'XXX12'),
  array('id' => 105, 'parent' => 19, 'title' => 'XXX13')
);

function sortDudzio($a, $b)
{
    // If you need to switch which way the values are sorted
    // switch the 1 and -1 around
    if($a['id'] > $b['id']) {
        return 1;
    } elseif($a['id'] < $b['id']) {
        return -1;
    } else {
        return 0;
    }
}

function getByParent($array, $id, $level)
{

    $orderedArray = array();

    foreach($array as $k=>$arr) {
        if($arr['parent'] == $id) {
            $arr['title'] = str_repeat('-', $level) . $arr['title'];
            $orderedArray[] = $arr;
            $children = getByParent($array, $arr['id'], $level + 1);
            foreach($children as $child) {
                $orderedArray[] = $child;
            }
        }
    }

    return $orderedArray;

}

usort($dudzio, 'sortDudzio');

print_r(getByParent($dudzio, 0, 0));

当您与hira…heira一起工作时。。。树状数据将数据表示为树总是一个好主意

下面的片段可以用于将平面数组转换为树,现在可以通过递归处理给定元素的所有
子数组来轻松处理树

该方法执行以下操作:

  • 迭代所有元素,直到平面数组为空(它假定每个元素都是根元素或在数组中有匹配的父元素)
  • 如果是根元素,则将其添加到
    结果
  • 如果匹配的父元素已被传输到
    结果
    数组,请将该元素作为子元素添加
我使用了第二个数组
$refs
,它只包含基于id的每个元素的引用,因为它允许在
$result
数组的任何级别插入元素,而无需搜索正确的级别

注:可能存在更容易理解的递归方法

pps.:我向任何元素添加了一个空的子数组,这样在插入子数组时就不必处理不存在的数组

<?php
$arr = array(
  array('id' => 1, 'parent' => 0, 'title' => 'XXX1', 'children'=>array()),
  array('id' => 85, 'parent' => 0, 'title' => 'XXX2', 'children'=>array()),
  array('id' => 41, 'parent' => 0, 'title' => 'XXX2', 'children'=>array()),
  array('id' => 17, 'parent' => 0, 'title' => 'XXX3', 'children'=>array()),
  array('id' => 66, 'parent' => 1, 'title' => 'XXX4', 'children'=>array()),
  array('id' => 92, 'parent' => 1, 'title' => 'XXX5', 'children'=>array()),
  array('id' => 65, 'parent' => 1, 'title' => 'XXX6', 'children'=>array()),
  array('id' => 45, 'parent' => 41, 'title' => 'XXX7', 'children'=>array()),
  array('id' => 19, 'parent' => 92, 'title' => 'XXX8', 'children'=>array()),
  array('id' => 101, 'parent' => 45, 'title' => 'XXX9', 'children'=>array()),
  array('id' => 102, 'parent' => 45, 'title' => 'XXX10', 'children'=>array()),
  array('id' => 103, 'parent' => 19, 'title' => 'XXX11', 'children'=>array()),
  array('id' => 104, 'parent' => 19, 'title' => 'XXX12', 'children'=>array()),
  array('id' => 105, 'parent' => 19, 'title' => 'XXX13', 'children'=>array())
);

$newArr = unflattenArray($arr);

echo "<pre>";
print_r($newArr);
echo "</pre>";


function unflattenArray($flatArray){
  $refs = array(); //for setting children without having to search the parents in the result tree.
    $result = array();

    //process all elements until nohting could be resolved.
    //then add remaining elements to the root one by one. 
    while(count($flatArray) > 0){
        for ($i=count($flatArray)-1; $i>=0; $i--){
            if ($flatArray[$i]["parent"]==0){
                //root element: set in result and ref!
                $result[$flatArray[$i]["id"]] = $flatArray[$i]; 
                $refs[$flatArray[$i]["id"]] = &$result[$flatArray[$i]["id"]];
                unset($flatArray[$i]);
        $flatArray = array_values($flatArray);
            }

            else if ($flatArray[$i]["parent"] != 0){
                //no root element. Push to the referenced parent, and add to references as well. 
                if (array_key_exists($flatArray[$i]["parent"], $refs)){
                    //parent found
                    $o = $flatArray[$i];
                    $refs[$flatArray[$i]["id"]] = $o;
          $refs[$flatArray[$i]["parent"]]["children"][] = &$refs[$flatArray[$i]["id"]];
                    unset($flatArray[$i]);
          $flatArray = array_values($flatArray);
                }
            }
        }
  }
  return $result;
}
它仍然未分类,但现在的格式可以轻松处理

例如,要对所有内容进行排序,现在可以简单地使用递归排序方法,如

sortmyarray($newArr);
回声“;
印刷费($newArr);
回声“;
函数排序数组(&$arr){
uasort($arr,“srt”);
foreach($arr作为$a){
Sortmyarray($a[“儿童]);
}
}
功能srt($a$b){
返回$a[“id”]-$b[“id”];
}

当然,同样的逻辑也可以用于操纵标题、显示数据等。

当您使用hira…heira。。。树状数据将数据表示为树总是一个好主意

下面的片段可以用于将平面数组转换为树,现在可以通过递归处理给定元素的所有
子数组来轻松处理树

该方法执行以下操作:

  • 迭代所有元素,直到平面数组为空(它假定每个元素都是根元素或在数组中有匹配的父元素)
  • 如果是根元素,则将其添加到
    结果
  • 如果匹配的父元素已被传输到
    结果
    数组,请将该元素作为子元素添加
我使用了第二个数组
$refs
,它只包含基于id的每个元素的引用,因为它允许在
$result
数组的任何级别插入元素,而无需搜索正确的级别

注:可能存在更容易理解的递归方法

pps.:我向任何元素添加了一个空的子数组,这样在插入子数组时就不必处理不存在的数组

<?php
$arr = array(
  array('id' => 1, 'parent' => 0, 'title' => 'XXX1', 'children'=>array()),
  array('id' => 85, 'parent' => 0, 'title' => 'XXX2', 'children'=>array()),
  array('id' => 41, 'parent' => 0, 'title' => 'XXX2', 'children'=>array()),
  array('id' => 17, 'parent' => 0, 'title' => 'XXX3', 'children'=>array()),
  array('id' => 66, 'parent' => 1, 'title' => 'XXX4', 'children'=>array()),
  array('id' => 92, 'parent' => 1, 'title' => 'XXX5', 'children'=>array()),
  array('id' => 65, 'parent' => 1, 'title' => 'XXX6', 'children'=>array()),
  array('id' => 45, 'parent' => 41, 'title' => 'XXX7', 'children'=>array()),
  array('id' => 19, 'parent' => 92, 'title' => 'XXX8', 'children'=>array()),
  array('id' => 101, 'parent' => 45, 'title' => 'XXX9', 'children'=>array()),
  array('id' => 102, 'parent' => 45, 'title' => 'XXX10', 'children'=>array()),
  array('id' => 103, 'parent' => 19, 'title' => 'XXX11', 'children'=>array()),
  array('id' => 104, 'parent' => 19, 'title' => 'XXX12', 'children'=>array()),
  array('id' => 105, 'parent' => 19, 'title' => 'XXX13', 'children'=>array())
);

$newArr = unflattenArray($arr);

echo "<pre>";
print_r($newArr);
echo "</pre>";


function unflattenArray($flatArray){
  $refs = array(); //for setting children without having to search the parents in the result tree.
    $result = array();

    //process all elements until nohting could be resolved.
    //then add remaining elements to the root one by one. 
    while(count($flatArray) > 0){
        for ($i=count($flatArray)-1; $i>=0; $i--){
            if ($flatArray[$i]["parent"]==0){
                //root element: set in result and ref!
                $result[$flatArray[$i]["id"]] = $flatArray[$i]; 
                $refs[$flatArray[$i]["id"]] = &$result[$flatArray[$i]["id"]];
                unset($flatArray[$i]);
        $flatArray = array_values($flatArray);
            }

            else if ($flatArray[$i]["parent"] != 0){
                //no root element. Push to the referenced parent, and add to references as well. 
                if (array_key_exists($flatArray[$i]["parent"], $refs)){
                    //parent found
                    $o = $flatArray[$i];
                    $refs[$flatArray[$i]["id"]] = $o;
          $refs[$flatArray[$i]["parent"]]["children"][] = &$refs[$flatArray[$i]["id"]];
                    unset($flatArray[$i]);
          $flatArray = array_values($flatArray);
                }
            }
        }
  }
  return $result;
}
它仍然未分类,但现在的格式可以轻松处理

例如,要对所有内容进行排序,现在可以简单地使用递归排序方法,如

sortmyarray($newArr);
回声“;
印刷费($newArr);
回声“;
函数排序数组(&$arr){
uasort($arr,“srt”);
foreach($arr作为$a){
Sortmyarray($a[“儿童]);
}
}
功能srt($a$b){
返回$a[“id”]-$b[“id”];
}

当然,同样的逻辑可以用来操纵标题,显示数据等等。

如果你在C++中做了类似的事情,那么你不应该在PHP中做任何事情。关于数组和数组的使用方法也是一样的…:)是的,但无论如何我不知道怎么做。我试过了,但就是不行@它不是复制品!如果你在C++中做了这样的事情,那么你不应该在PHP中做任何事情。差不多一样