草庐IT

php - 对嵌套的多维 PHP 数组的每一层进行排序

coder 2024-04-07 原文

我有一个多维 PHP 数组,用于生成分层 UL 树。但是,在显示 UL 树之前,我想按“名称”属性的字母顺序对数组中的每个级别进行排序。我在想象一个递归检查每个级别的函数,按字母顺序组织它,然后移动到下一个级别对该级别进行排序。但我不确定该怎么做。任何帮助将不胜感激!

我的数组:

Array ( 
 [0] => Array ( 
   [id] => 39348
   [parent] => 0
   [name] => Test 
   [children] => Array ( 
     [0] => Array ( 
       [id] => 41911 
       [parent] => 39348 
       [name] => Test2 
       [children] => Array ( 
         [0] => Array ( 
            [id] => 40929
            [parent] => 41911
            [name] => Test3 
            [children] => Array ( 
               [0] => Array (
                   [id] => 40779 
                   [parent] => 40929 
                   [name] => C 
               ) 
               [1] => Array (
                   [id] => 40780 
                   [parent] => 40929
                   [name] => A
               ) 
            ) 
         )
      ) 
   )

我的尝试是移动顺序,但仍然不是按字母顺序排列的。请注意,我正在使用的 CodeIgniter 需要 array($this,'sortByName'):

function recursive_sort($array) {
  usort($array, array($this,'sortByName'));
  foreach($array as $key => $value) {
    if(isset($value['children']) && !empty($value['children']) && is_array($value['children'])) {
      $array[$key]['children'] = $this->recursive_sort($value['children']);
    }
  }
  return $array;
}

function sortByName($a, $b){
    return $a->name - $b->name;
}

更新:解决方案

function recursive_sort($array,$child='children') {
        usort($array,function($a,$b){
            return strcasecmp($a['name'], $b['name']);
        });
        foreach($array as $key => $value) {
            if(isset($value[$child]) && !empty($value[$child]) && is_array($value[$child])) {
              $array[$key][$child] = $this->recursive_sort($value[$child],$child);
            }
        }
        return $array;
    }

最佳答案

我输入了一种算法思维方式,因此您可以自己实现代码。再说了,我也不想剥夺你所有的乐趣! :-)

如果这对您来说还不够,请查看 this .

function example(element) {
    if (no children exist) return
    if (only one element exist on this level) 
        // if this code is reached, this element has children
        example(children element)
        return
    names = { array of all name attributes of all elements on this level }
    sort(names)
    [0] => names[0]
    [1] => names[1]
       .. and so on for however many elements there are
    return

关于php - 对嵌套的多维 PHP 数组的每一层进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34505065/

有关php - 对嵌套的多维 PHP 数组的每一层进行排序的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  4. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  5. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  6. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  7. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  8. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  9. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  10. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

随机推荐