php 将具有3列的2D数组转换为没有关联键的层次结构

mwkjh3gx  于 2023-06-04  发布在  PHP
关注(0)|答案(2)|浏览(137)

我有这样的数据:

它也可以被看作是这个PHP数组:

$items = [
    ['item1' => 'a', 'item2' => 'c', 'item3' => 'h'],
    ['item1' => 'a', 'item2' => 'c', 'item3' => 'i'],
    ['item1' => 'a', 'item2' => 'd', 'item3' => 'j'],
    ['item1' => 'a', 'item2' => 'd', 'item3' => 'k'],
    ['item1' => 'b', 'item2' => 'e', 'item3' => 'l'],
    ['item1' => 'b', 'item2' => 'e', 'item3' => 'm'],
    ['item1' => 'b', 'item2' => 'f', 'item3' => 'n'],
    ['item1' => 'b', 'item2' => 'g', 'item3' => 'o'],
];

甚至这个(多维)列表:

a
    c
        h
        i
    d
        j
        k
b
    e
        l
        m
    f
        n
    g
        o

我如何循环遍历这些数据并创建一个像这样的多维数组

$items = [
    [a, [[c, [h, i]], [d, [j, k]]],  
    [b, [[e, [l, m]], [f, [n]], [g, [o]]]
];

基本上我的目标是建立多维的html列表,但我的大脑卡住了。有了多维数组我就能做到。
谢谢!
这里有一个尝试来解决它。这是一个更复杂的例子。它是“太硬编码”。索引中有一些错误。
我在想有没有更干净的方法。

<?php

$items = [
    ['item1' => 'a', 'item2' => 'c', 'item3' => 'd2', 'item4' => 'f'],
    ['item1' => 'a', 'item2' => 'c', 'item3' => 'd2', 'item4' => 'g'],
    ['item1' => 'a', 'item2' => 'd', 'item3' => 'd3', 'item4' => 'h'],
    ['item1' => 'a', 'item2' => 'd', 'item3' => 'e', 'item4' => 'i'],
    ['item1' => 'b', 'item2' => 'c', 'item3' => 'e', 'item4' => 'j'],
    ['item1' => 'b', 'item2' => 'c', 'item3' => 'e', 'item4' => 'k'],
    ['item1' => 'b', 'item2' => 'c', 'item3' => 'e', 'item4' => 'l'],
    ['item1' => 'b', 'item2' => 'c2', 'item3' => 'e', 'item4' => 'm'],
];

        $items_new = [];

        $item1 = '';
        $item2 = '';
        $item3 = '';
        $item4 = '';

        foreach ($items as $item):

          $item1_new = $item['item1'];
          $item2_new = $item['item2'];
          $item3_new = $item['item3'];
          $item4_new = $item['item4'];

          if($item1 != $item1_new)
          {
            $items_new[] = [$item1_new, []];

            $item1 = $item1_new;

            $item2 = '';
          }
          
          if($item2 != $item2_new)
          {
            $items_new[count($items_new) - 1][] = [$item2_new, []];

            $item2 = $item2_new;

            $item3 = '';
          }

          if($item3 != $item3_new)
          {
            $items_new[count($items_new) - 1][count($items_new[1]) - 1][] = [$item3_new, []];

            $item3 = $item3_new;

            $item4 = '';
          }

          if($item4 != $item4_new)
          {
            $items_new[count($items_new) - 1][count($items_new[1]) - 1][count($items_new[2]) - 1][] = [$item4_new, []];

            $item4 = $item4_new;
          }

        endforeach;
 

        foreach($items_new as $items1)
        {
          if (is_string($items1))
          {
            echo $items1 . '<br>';
          }
          elseif (is_array($items1))
          {
            foreach($items1 as $items2)
            {
                if (is_string($items2))
                {
                  echo  ' - ' . $items2 . '<br>';
                }
                elseif (is_array($items2))
                {
                  foreach ($items2 as $items3)
                  {
                    if (is_string($items3))
                    {
                      echo  ' --- ' . $items3 . '<br>';
                    }
                    elseif (is_array($items3))
                    {
                      foreach ($items3 as $items4)
                      {
                        if (is_string($items4))
                        {
                          echo  ' ----- ' . $items4 . '<br>';
                        }
                        elseif (is_array($items4))
                        {
                          foreach ($items4 as $items5)
                          {
                            if (is_string($items5))
                            {
                              echo  ' ------- ' . $items5 . '<br>';
                            }
                            elseif (is_array($items5))
                            {
                              foreach ($items5 as $items6)
                              {
                                
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
            }
          }
        }
        ?>
kq0g1dla

kq0g1dla1#

在推送和管理数据分组时,使用引用可避免跟踪显式索引。
一个引用将确定是否需要示例化新的顶级行并将其推入结果数组。另一个引用将确定是否需要示例化唯一的第二级行并将其推送到其父行中。
代码:(Demo

$result = [];
foreach ($items as $row) {
    $k1 = $row['item1'];
    $k2 = $row['item1'] . '_' . $row['item2'];
    if (!isset($ref2[$k2])) {
        $ref2[$k2] = [$row['item2'], [$row['item3']]];
        if (!isset($ref1[$k1])) {
            $ref1[$k1] = [$row['item1'], &$ref2[$k2]];
            $result[] = &$ref1[$k1];
        } else {
            $ref1[$k1][] = &$ref2[$k2];
        }
    } else {
        $ref2[$k2][1][] = $row['item3'];
    }
}
echo json_encode($result);

输出(带有一些换行符和制表符以提高可读性):

[
    ["a",["c",["h","i"]],["d",["j","k"]]],
    ["b",["e",["l","m"]],["f",["n"]],["g",["o"]]]
]

通过将该过程 Package 在另一组类似的条件中,可以扩展上述代码段,使每行包含4个元素。请注意(与第一个代码片段一样),只有最低级别的元素没有被声明为引用。Demo

$items = [
    ['item1' => 'a', 'item2' => 'c', 'item3' => 'd2', 'item4' => 'f'],
    ['item1' => 'a', 'item2' => 'c', 'item3' => 'd2', 'item4' => 'g'],
    ['item1' => 'a', 'item2' => 'd', 'item3' => 'd3', 'item4' => 'h'],
    ['item1' => 'a', 'item2' => 'd', 'item3' => 'e', 'item4' => 'i'],
    ['item1' => 'b', 'item2' => 'c', 'item3' => 'e', 'item4' => 'j'],
    ['item1' => 'b', 'item2' => 'c', 'item3' => 'e', 'item4' => 'k']
];

$result = [];
foreach ($items as $row) {
    $k1 = $row['item1'];
    $k2 = $row['item1'] . '_' . $row['item2'];
    $k3 = $row['item1'] . '_' . $row['item2'] . '_' . $row['item3'];
    if (!isset($ref3[$k3])) {
        $ref3[$k3] = [$row['item3'], [$row['item4']]];
        if (!isset($ref2[$k2])) {
            $ref2[$k2] = [$row['item2'], &$ref3[$k3]];
            if (!isset($ref1[$k1])) {
                $ref1[$k1] = [$row['item1'], &$ref2[$k2]];
                $result[] = &$ref1[$k1];
            } else {
                $ref1[$k1][] = &$ref2[$k2];
            }
        } else {
            $ref2[$k2][1][] = &$ref3[$k3];
        }
    } else {
        $ref3[$k3][1][] = $row['item4'];
    }
}
echo json_encode($result);

输出:

[
    ["a",["c",["d2",["f","g"]]],["d",["d3",["h"],["e",["i"]]]]],
    ["b",["c",["e",["j","k"]]]]
]
beq87vna

beq87vna2#

解决了!

$items = [
            ['item1' => 'a', 'item2' => 'c', 'item3' => 'd2', 'item4' => 'f'],
            ['item1' => 'a', 'item2' => 'c', 'item3' => 'd1', 'item4' => 'g'],
            ['item1' => 'a', 'item2' => 'd', 'item3' => 'd3', 'item4' => 'h'],
            ['item1' => 'a', 'item2' => 'd', 'item3' => 'e', 'item4' => 'i'],
            ['item1' => 'b', 'item2' => 'c', 'item3' => 'e', 'item4' => 'j'],
            ['item1' => 'b', 'item2' => 'c', 'item3' => 'e', 'item4' => 'k'],
            ['item1' => 'b', 'item2' => 'c', 'item3' => 'e1', 'item4' => 'l'],
            ['item1' => 'b', 'item2' => 'c2', 'item3' => 'e', 'item4' => 'm'],
            ['item1' => 'x', 'item2' => 'c2', 'item3' => 'e', 'item4' => 'm'],
            ['item1' => 'x', 'item2' => 'c2', 'item3' => 'e2', 'item4' => 'n'],
        ];

        $items_new = [];

        $item1 = '';
        $count1 = 0;

        foreach ($items as $item):

          $item1_new = $item['item1'];
          $item2_new = $item['item2'];
          $item3_new = $item['item3'];
          $item4_new = $item['item4'];

          if($item1 != $item1_new)
          {
            $items_new[] = [$item1_new, []];
            
            $item1 = $item1_new;
            $count1++;

            $item2 = '';
            $count2 = 0;
          }

          if($item2 != $item2_new)
          {
            $items_new[$count1 - 1][$count2+1] = [$item2_new, []] ;
           
            $item2 = $item2_new;
            $count2++;

            $item3 = '';
            $count3 = 0;
          }
          
          if($item3 != $item3_new)
          {
            $items_new[$count1 - 1][$count2+1-1][$count3+1] = [$item3_new, []] ;
           
            $item3 = $item3_new;
            $count3++;

            $item4 = '';
            $count4 = 0;
          }

          if($item4 != $item4_new)
          {
            $items_new[$count1 - 1][$count2+1-1][$count3+1-1][$count4+1]  = [$item4_new] ;
           
            $item4 = $item4_new;
            $count4++;
          }
        
        endforeach;
 

        foreach($items_new as $items1)
        {
          if (is_string($items1))
          {
            echo $items1 . '<br>';
          }
          else
          {
            foreach($items1 as $items2)
            {
                if (is_string($items2))
                {
                  echo  ' - ' . $items2 . '<br>';
                }
                else
                {
                  foreach ($items2 as $items3)
                  {
                    if (is_string($items3))
                    {
                      echo  ' --- ' . $items3 . '<br>';
                    }
                    else
                    {
                      foreach ($items3 as $items4)
                      {
                        if (is_string($items4))
                        {
                          echo  ' ----- ' . $items4 . '<br>';
                        }
                        else
                        {
                          foreach ($items4 as $items5)
                          {
                            if (is_string($items5))
                            {
                              echo  ' ------- ' . $items5 . '<br>';
                            }
                          }
                        }
                      }
                    }
                  }
                }
            }
          }
        }

相关问题