在PHP中将1D数组转换为多维数组

Bas*_*adi 1 php arrays

我有这个数组:

Array
(
    [1] => animal
    [1-1] => turtle
    [1-1-1] => sea turtle
    [1-1-2] => box turtle
    [1-1-3] => green turtle
    [1-1-3-1] => green turtle with brown tail
)
Run Code Online (Sandbox Code Playgroud)

我想要一些如何将其转换为:

Array
(
    [1-title] => animal
    [1-sons] => array(
            [1-1-title] => turtle
            [1-1-sons] => array(
                    [1-1-1] => sea turtle
                        [1-1-2] => box turtle
                    [1-1-3-title] => green turtle
                    [1-1-3-sons] => array(
                            [1-1-3-title] => green turtle
                                  )
                    )
              )
)
Run Code Online (Sandbox Code Playgroud)

或者你可以建议一个更好的方法来组织输出的数组..

但是怎么做?

我知道这根本不是一件容易的事,我正在编写一个解析器来处理数据并从中创建树.

在此先感谢您的帮助和建议..

And*_*ore 8

组织数据的最简单方法是这样:

array (
  'Animal' =>
  array (
    'Turtle' =>
    array (
      'Sea Turtle',
      'Box Turtle',
      'Green Turtle' =>
      array (
        'Green Turtle With Brown Tail',
      ),
      'Common Turtle',
    ),
  ),
);

// Or, otherwise written (equivalent to the above)

$animals = array();
$animals['Animal'] = array();
$animals['Animal']['Turtle'] = array();
$animals['Animal']['Turtle'][] = 'Sea Turtle';
$animals['Animal']['Turtle'][] = 'Box Turtle';
$animals['Animal']['Turtle']['Green Turtle'] = array();
$animals['Animal']['Turtle']['Green Turtle'][] = 'Green Turtle With Brown Tail';
$animals['Animal']['Turtle'][] = 'Common Turtle';
Run Code Online (Sandbox Code Playgroud)

基本上,动物的名称是值,除非它有子,否则值是一个数组,键是动物名称.


这样,您可以通过执行以下操作轻松解析值:

parse_animals($animals);

function parse_animals($array, $indent = 0) {
  if(!is_array($array)) return;    // A little safe guard in case.

  foreach($array as $key => $value) {
    echo str_repeat('  ', $indent) . "- ";

    if(is_array($value)) {
      echo $key . "\n";
      parse_animals($value, $indent + 1);
    } else {
      echo $value . "\n";
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

以上控制台将输出以下内容:

- Animal
  - Turtle
    - Sea Turtle
    - Box Turtle
    - Green Turtle
      - Green Turtle With Brown Tail
    - Common Turtle
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个将其输出为网页的版本.

function parse_animals_web($array) {
  if(!is_array($array)) return;    // A little safe guard in case.

  foreach($array as $key => $value) {
    echo '<ul>';

    if(is_array($value)) {
      echo '<li>' . htmlentities($key) . "</li>";
      parse_animals_web($value);
    } else {
      echo '<li>' . htmlentities($value) . "</li>";
    }

    echo '</ul>';
  }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

  • 动物
    • 海龟
    • 盒龟
    • 绿海龟
      • 与棕色尾巴的绿海龟
    • 普通龟

也许你想要一个动物的孩子.

function get_children_of($array, $name) {
  foreach($array as $key => $value) {
    if(is_array($value)) {
      if($key === $name) {
        return $value;
      } else {
        return get_children_of($value, $name);
      }
    }
  }

  return array();
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以得到它的所有孩子Green Turtle并输出它们.

$green_turtle = get_children_of($animals, 'Green Turtle');
parse_array($green_turtle);
Run Code Online (Sandbox Code Playgroud)

输出是:

- Green Turtle With Brown Tail
Run Code Online (Sandbox Code Playgroud)

编辑:因为你说你被困在输入数组是那种奇怪的格式,这里有一个函数,将您的数组转换为我上面指定的格式:

function convert_array($array) {
  $new_array = array();

  $keys = array_keys($array);
  foreach($keys as $key) {
    $level = explode('-', $key);
    $cur_level = &$new_array;
    $cur_key = '';

    foreach($level as $o_key) {
      $cur_key = ltrim($cur_key . '-' . $o_key, '-');
      $next_key = $cur_key . '-1';
      $value = $array[$cur_key];
      $has_child = array_key_exists($next_key, $array);

      if($has_child) {
        if(!array_key_exists($value, $cur_level)) {
          $cur_level[$value] = array();
        }
        $cur_level = &$cur_level[$value];
      } else {
        $cur_level[] = $value;
      }
    }
  }

  return $new_array;
}
Run Code Online (Sandbox Code Playgroud)

  • +1在效率和服务的完美结合下完全钦佩 (4认同)