【问题标题】:PHP - Reindexing nested array recursivelyPHP - 递归地重新索引嵌套数组
【发布时间】:2017-06-12 13:51:37
【问题描述】:

编写此递归函数来重新索引数组(见下图 - 我使用的 JSON 化数组,以便更好地查看它)

代码:

 private function reindex($array)
 {
        foreach ($array as $key => $value) {

            if (is_array($value)) {

                $array[$key]=$this->reindex($value);

            }

            array_values($array);



        }

        return $array;


 }

目标是重新索引它,以便索引没有跳跃,即

$arr['body'][0]['1']['body'] 在索引 2、4 和 6 处有元素,想将其重新索引为 0、1、2

也应该适用于不同的数组(n 个嵌套数组)。应该是通用函数。

我该怎么做?

谢谢,

更新 1:

Var_dump 输出:

array(4) {
  ["token_name"]=>
  string(6) "C_ROOT"
  ["token_group"]=>
  string(7) "C_BLOCK"
  ["group"]=>
  bool(true)
  ["body"]=>
  array(1) {
    [0]=>
    array(2) {
      [0]=>
      array(7) {
        ["token_name_org"]=>
        string(8) "T_SWITCH"
        ["token"]=>
        int(339)
        ["value"]=>
        string(6) "switch"
        ["line"]=>
        int(2)
        ["token_group"]=>
        string(9) "FUNCTIONS"
        ["token_name"]=>
        string(8) "C_SWITCH"
        ["args"]=>
        array(1) {
          [0]=>
          array(1) {
            [0]=>
            array(7) {
              ["token_name_org"]=>
              string(10) "T_VARIABLE"
              ["token"]=>
              int(320)
              ["value"]=>
              string(4) "argv"
              ["line"]=>
              int(2)
              ["token_group"]=>
              string(9) "VARIABLES"
              ["token_name"]=>
              string(10) "C_VARIABLE"
              ["args"]=>
              array(1) {
                [0]=>
                array(1) {
                  [0]=>
                  array(6) {
                    ["token_name_org"]=>
                    string(9) "T_LNUMBER"
                    ["token"]=>
                    int(317)
                    ["value"]=>
                    string(1) "1"
                    ["line"]=>
                    int(2)
                    ["token_group"]=>
                    string(9) "VARIABLES"
                    ["token_name"]=>
                    string(8) "C_NUMBER"
                  }
                }
              }
            }
          }
        }
      }
      [1]=>
      array(4) {
        ["token_name"]=>
        string(7) "C_BLOCK"
        ["token_group"]=>
        string(7) "C_BLOCK"
        ["group"]=>
        bool(true)
        ["body"]=>
        array(4) {
          [0]=>
          array(1) {
            [0]=>
            array(4) {
              ["token_name"]=>
              string(12) "C_CASE_BLOCK"
              ["token_group"]=>
              string(12) "C_CASE_BLOCK"
              ["group"]=>
              bool(true)
              ["args"]=>
              array(1) {
                [0]=>
                array(6) {
                  ["token_name_org"]=>
                  string(9) "T_LNUMBER"
                  ["token"]=>
                  int(317)
                  ["value"]=>
                  string(2) "10"
                  ["line"]=>
                  int(4)
                  ["token_group"]=>
                  string(9) "VARIABLES"
                  ["token_name"]=>
                  string(8) "C_NUMBER"
                }
              }
            }
          }
          [2]=>
          array(1) {
            [0]=>
            array(5) {
              ["token_name"]=>
              string(12) "C_CASE_BLOCK"
              ["token_group"]=>
              string(12) "C_CASE_BLOCK"
              ["group"]=>
              bool(true)
              ["args"]=>
              array(1) {
                [0]=>
                array(6) {
                  ["token_name_org"]=>
                  string(26) "T_CONSTANT_ENCAPSED_STRING"
                  ["token"]=>
                  int(323)
                  ["value"]=>
                  string(13) "single_quoted"
                  ["line"]=>
                  int(7)
                  ["token_group"]=>
                  string(7) "STRINGS"
                  ["token_name"]=>
                  string(8) "C_STRING"
                }
              }
              ["body"]=>
              array(1) {
                [0]=>
                array(5) {
                  [0]=>
                  array(6) {
                    ["token_name_org"]=>
                    string(10) "T_VARIABLE"
                    ["token"]=>
                    int(320)
                    ["value"]=>
                    string(3) "val"
                    ["line"]=>
                    int(8)
                    ["token_group"]=>
                    string(9) "VARIABLES"
                    ["token_name"]=>
                    string(10) "C_VARIABLE"
                  }
                  [1]=>
                  array(6) {
                    ["token_name_org"]=>
                    string(18) "C_ASSIGNMENT_EQUAL"
                    ["line"]=>
                    int(8)
                    ["value"]=>
                    string(1) "="
                    ["token"]=>
                    string(5) "VALUE"
                    ["token_group"]=>
                    string(11) "ASSIGNMENTS"
                    ["token_name"]=>
                    string(18) "C_ASSIGNMENT_EQUAL"
                  }
                  [2]=>
                  array(6) {
                    ["token_name_org"]=>
                    string(9) "T_LNUMBER"
                    ["token"]=>
                    int(317)
                    ["value"]=>
                    string(1) "3"
                    ["line"]=>
                    int(8)
                    ["token_group"]=>
                    string(9) "VARIABLES"
                    ["token_name"]=>
                    string(8) "C_NUMBER"
                  }
                  [3]=>
                  array(6) {
                    ["token_name_org"]=>
                    string(7) "VALUE_-"
                    ["line"]=>
                    int(8)
                    ["value"]=>
                    string(1) "-"
                    ["token"]=>
                    string(5) "VALUE"
                    ["token_group"]=>
                    string(9) "OPERATORS"
                    ["token_name"]=>
                    string(16) "C_OPERATOR_MINUS"
                  }
                  [4]=>
                  array(6) {
                    ["token_name_org"]=>
                    string(9) "T_LNUMBER"
                    ["token"]=>
                    int(317)
                    ["value"]=>
                    string(1) "5"
                    ["line"]=>
                    int(8)
                    ["token_group"]=>
                    string(9) "VARIABLES"
                    ["token_name"]=>
                    string(8) "C_NUMBER"
                  }
                }
              }
            }
          }
          [4]=>
          array(1) {
            [0]=>
            array(5) {
              ["token_name"]=>
              string(12) "C_CASE_BLOCK"
              ["token_group"]=>
              string(12) "C_CASE_BLOCK"
              ["group"]=>
              bool(true)
              ["args"]=>
              array(1) {
                [0]=>
                array(6) {
                  ["token_name_org"]=>
                  string(26) "T_CONSTANT_ENCAPSED_STRING"
                  ["token"]=>
                  int(323)
                  ["value"]=>
                  string(13) "double_quoted"
                  ["line"]=>
                  int(11)
                  ["token_group"]=>
                  string(7) "STRINGS"
                  ["token_name"]=>
                  string(8) "C_STRING"
                }
              }
              ["body"]=>
              array(1) {
                [0]=>
                array(1) {
                  [0]=>
                  array(7) {
                    ["token_name_org"]=>
                    string(6) "T_ECHO"
                    ["token"]=>
                    int(328)
                    ["value"]=>
                    string(4) "echo"
                    ["line"]=>
                    int(13)
                    ["token_group"]=>
                    string(9) "FUNCTIONS"
                    ["token_name"]=>
                    string(6) "C_ECHO"
                    ["args"]=>
                    array(1) {
                      [0]=>
                      array(1) {
                        [0]=>
                        array(6) {
                          ["token_name_org"]=>
                          string(26) "T_CONSTANT_ENCAPSED_STRING"
                          ["token"]=>
                          int(323)
                          ["value"]=>
                          string(13) "double quoted"
                          ["line"]=>
                          int(13)
                          ["token_group"]=>
                          string(7) "STRINGS"
                          ["token_name"]=>
                          string(8) "C_STRING"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
          [6]=>
          array(3) {
            [0]=>
            array(4) {
              ["token_name_org"]=>
              string(9) "T_DEFAULT"
              ["token"]=>
              int(342)
              ["value"]=>
              string(7) "default"
              ["line"]=>
              int(18)
            }
            [1]=>
            array(6) {
              ["token_name_org"]=>
              string(17) "C_SEPARATOR_COLON"
              ["line"]=>
              int(18)
              ["value"]=>
              string(1) ":"
              ["token"]=>
              string(5) "VALUE"
              ["token_group"]=>
              string(10) "SEPARATORS"
              ["token_name"]=>
              string(17) "C_SEPARATOR_COLON"
            }
            [2]=>
            array(6) {
              ["token_name_org"]=>
              string(7) "T_BREAK"
              ["token"]=>
              int(343)
              ["value"]=>
              string(5) "break"
              ["line"]=>
              int(19)
              ["token_group"]=>
              string(16) "TODO_BREAK_GROUP"
              ["token_name"]=>
              string(7) "C_BREAK"
            }
          }
        }
      }
    }
  }
}

【问题讨论】:

  • 您是在尝试保留字符串键还是希望整个内容都是数字?
  • 我想只重新索引数字键...字符串键应该保持原样。最好按字母顺序对它们进行排序,但这是可选的......
  • @dev 请始终将您的数组类型数据显示为var_export(),以便志愿者可以立即在他们的演示/测试脚本中使用您的数据。我打算提供一个答案,但首先我需要完全重新格式化您的数据,以便我可以使用它。
  • @dev Stack Overflow 还要求您提供minimal reproducible example。如果您删除了许多不相关的关联数组(不破坏相关结构),您的示例数组可能会小得多。

标签: php arrays


【解决方案1】:

这是一种只重新索引数值的方法:

function reindex($array)
{
    $index = 0;
    $return = [];

    foreach ($array as $key => $value) {
        if (is_string($key)) {
            $newKey = $key;
        } else {
            $newKey = $index;
            ++$index;
        }

        $return[$newKey] = is_array($value) ? reindex($value) : $value;
    }

    // Sort alphabetically, numeric first then alpha
    ksort($return, SORT_NATURAL);

    return $return;
}

此处示例:http://ideone.com/969OGa

【讨论】:

  • 别担心,如果你想排序字母然后数字使用ksort($return, SORT_NUMERIC);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2019-12-04
  • 2018-11-16
相关资源
最近更新 更多