在多维数组上使用UASORT的PHP递归循环

时间:2019-01-20 18:46:48

标签: php arrays recursion multidimensional-array uasort

我正在编写一个遍历多维数组的脚本,它可以按预期运行(但确实如此),但是出现了我无法解决的错误。

对于管理嵌套数组,我仍然不太满意构建循环。

这是我的代码。目标是按 sequence 键的值对每一层进行排序,最后将数组导出为json。

每个子数组中可能存在也可能不存在序列键,因此可能需要某种 if子句

import imaplib
import email

obj = imaplib.IMAP4('imap', portn)
obj.login('username', 'password')

obj.select('INBOX')

uidl_list = [68720]

resp, data = obj.uid('FETCH', ','.join(map(str, uidl_list)) , '(BODY.PEEK[HEADER.FIELDS (From Subject)] RFC822.SIZE)')

这是我得到的输出和错误,我想我理解为什么会引发该错误,但同时我无法实施修复该错误所需的适当检查。

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;

    root /usr/share/nginx/html;
    index index.php;

    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    server_tokens off;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

我不是很担心,但是我还想让数组仍然按原始顺序进行结构化,即:<?php $list = [ "key" => "book", "sequence" => 1, "items" => [ [ "key" => "verse", "sequence" => 2, "items" => [ ["sequence" => 3], ["sequence" => 1], ["sequence" => 2], ], ], [ "key" => "page", "sequence" => 1, "items" => [ [ "key" => "page", "sequence" => 2, "items" => [ ["sequence" => 2], ["sequence" => 1], ["sequence" => 3], ], ], [ "key" => "paragraph", "sequence" => 1, "items" => [ ["sequence" => 2], ["sequence" => 1], ["sequence" => 3], ], ], ], ], ], ]; function sortit(&$array){ foreach($array as $key => &$value){ //If $value is an array. if(is_array($value)){ if($key == "items"){ uasort($value, function($a,&$b) { return $a["sequence"] <=> $b["sequence"]; }); } //We need to loop through it. sortit($value); } else{ //It is not an array, so print it out. echo $key . " : " . $value . "<br/>"; } } } sortit($list); echo "<pre>"; print_r($list); ?>

1 个答案:

答案 0 :(得分:1)

使用usort和数组引用使其简单明了。如果我们要处理带有一组item键的数组,请对item数组进行排序并对其子级进行递归,否则,我们将处于叶节点并可以返回。

function seqSort(&$arr) {
    if (is_array($arr) && array_key_exists("items", $arr)) {
        usort($arr["items"], function ($a, $b) {
            return $a["sequence"] - $b["sequence"];
        });

        foreach ($arr["items"] as &$item) {
            $item = seqSort($item);
        }
    }

    return $arr;
}

结果:

array (
  'key' => 'book',
  'sequence' => 1,
  'items' => 
  array (
    0 => 
    array (
      'key' => 'page',
      'sequence' => 1,
      'items' => 
      array (
        0 => 
        array (
          'key' => 'page',
          'sequence' => 1,
          'items' => 
          array (
            0 => 
            array (
              'sequence' => 1,
            ),
            1 => 
            array (
              'sequence' => 2,
            ),
            2 => 
            array (
              'sequence' => 3,
            ),
          ),
        ),
      ),
    ),
    1 => 
    array (
      'key' => 'verse',
      'sequence' => 2,
      'items' => 
      array (
        0 => 
        array (
          'sequence' => 1,
        ),
        1 => 
        array (
          'sequence' => 2,
        ),
        2 => 
        array (
          'sequence' => 3,
        ),
      ),
    ),
  ),
)

Try it!

请注意,最外面的结构是一个根节点,该根节点不是数组的一部分,无法进行排序(这可能是无意的,并引起混乱)。