无限遍历数组
<?php
    function fun($arr){
        foreach($arr as $key => $value){
            if(is_array($value)){
                fun($value);
            }else{
                echo $value;
            }
        }
    }
   $array = ['a'=>'123','b'=>'456',['c'=>'666','d'=>'8888',['e'=>'4578','f'=>'484878']]]; 
   fun($array);
?>
对无限数组格式化数组中的值
public function index()
{
    $data = [
        '1',
        '2',
        '3',
        [
            'a' => '333',
            ['b' => '111']
        ]
    ];
    $result = $this->recursion($data);
    dump($result);
}
public function recursion(array $data) : array
{
    $res = [];
    if (is_array($data) && count($data)) {
        foreach ($data as $k => $v) {
            if (is_array($v) && count($v)) {
                $res[$k] = $this->recursion($v);
            } elseif (is_string($v)) {
                $res[$k] = (int)$v;
            }
        }
    }
    return $res;
}
// 或者这种
public static function recursion(array &$data) : array
{
    foreach ($data as $k => &$v) {
        if (! is_array($v)) {
            if (is_numeric($v)) {
                $v = intval($v);
            }
        } else {
            static::recursion($v);
        }
    }
    return $data;
}    
无限遍历与分类(一)
$db = new mysqli('127.0.0.1', 'root', '123456', 'test');
$db->query("SET NAMES UTF8");
$res = $db->query('select * from menus');
$items = array();
while ($row = $res->fetch_array(MYSQLI_ASSOC)) {
    $items[$row['id']] = $row;
}
$tree = [];
foreach ($items as $key => $item) {
    $items[$item['pid']]['son'][$item['id']] = &$items[$item['id']];
}
// 所有数据堆成的数据树
$tree = $items[0]['son'];
function a ($tree , &$result = array(), &$level = 0) {
    if (is_array($tree)) {
        $level++;
        foreach ($tree as $id => $data) {
            $data['level'] = $level;
            $result[$id] = $data;
            if (isset($data['son'])) {
                a($data['son'], $result, $level);
                unset($result[$id]['son']);
            }
        }
        $level = 0;
    }
    return $result;
}
$newtree = a($tree);
echo json_encode($newtree);
无限遍历与分类(二)
$db = new mysqli('127.0.0.1', 'root', '123456', 'test');
$db->query("SET NAMES UTF8");
$res = $db->query('select * from menus');
$items = array();
while ($row = $res->fetch_array(MYSQLI_ASSOC)) {
    $items[] = $row;
}
public function menulist($menu,$id=0,$level=0){
	
	static $menus = array();
	foreach ($menu as $value) {
		if ($value['pid']==$id) {
			$value['level'] = $level+1;
			if($level == 0)
			{
				$value['str'] = str_repeat('',$value['level']);
			}
			elseif($level == 2)
			{
				$value['str'] = '    '.'└ ';
			}
			elseif($level == 3)
			{
				$value['str'] = '      '.'└ ';
			}
			else
			{
				$value['str'] = '  '.'└ ';
			}
			$menus[] = $value;
			$this->menulist($menu,$value['id'],$value['level']);
		}
	}
	return $menus;
}
$newRows = menulist($items);	
	无限遍历与分类 (三)
<?php
$arrs = [
    [
        'id'=>1,
        'parent_id'=>0
    ],
    [
        'id'=>2,
        'parent_id'=>1
    ],
    [
        'id'=>3,
        'parent_id'=>2
    ],
    [
        'id'=>4,
        'parent_id'=>2
    ],
    [
        'id'=>5,
        'parent_id'=>0
    ],
];
function getTree($arrs,$root=0,$level=100)
{
    $tree = array();
    foreach ($arrs as $foo) {
        if ($foo['parent_id'] == $root) {
           if($level>0){               
            $foo['children'] = getTree($arrs,$foo['id'],$level-1);     
           }
            $tree[] = $foo;
        }
    }
    --$level;
    return $tree;
}
var_export ($arrs,0,0)// 一级
无限遍历与分类 (四)
对具有父子关系的数组进行重新排序,不改变数据结构
public function index()
{
    $permissions = [
        ['id' => 1, 'pid' => '0', 'name' => 'a'],
        ['id' => 2, 'pid' => '0', 'name' => 'b'],
        ['id' => 3, 'pid' => '0', 'name' => 'c'],
        ['id' => 4, 'pid' => '1', 'name' => 'a-1'],
        ['id' => 5, 'pid' => '1', 'name' => 'a-2'],
        ['id' => 6, 'pid' => '3', 'name' => 'c-1'],
        ['id' => 7, 'pid' => '3', 'name' => 'c-2'],
        ['id' => 9, 'pid' => '4', 'name' => 'a-1-2'],
        ['id' => 8, 'pid' => '4', 'name' => 'a-1-1'],
    ];
    $data = $this->permissionTree($permissions);
    return $data;
}
/**
 * 根据父子关系重新排序
 *
 * @param $data  具有父子关系的二维数组
 * @param int $root  获取指定层级标识
 * @param array $result  用于保存数据的数组
 * @return array
 */
public function permissionTree($data, $root = 0, &$result = [])
{
    foreach ($data as $item) {
        // 排除掉非直接子集
        if ($item['pid'] != $root) {
            continue;
        }
        $result[$item['id']] = $item;
        $this->permissionTree($data, $item['id'], $result);
    }
    return $result;
}

