繁体   English   中英

有没有更好的方法来编写此代码的逻辑?

[英]Is there a better way to write the logic of this code?

我将获得$dados表单数据库,每个元素将具有3个信息codnometree

tree将用于制作一棵树,在视觉上就像文件管理器一样,以显示此类别(在var $nome ),而var $cod将被隐藏。

该代码已经可以使用,但是我想知道是否可以更改其他代码的“开关”,主要是因为我只覆盖了第7个子树,但是树是否更大? 此代码无效。

有任何想法吗?

<?php

$dados[0] = [ 'cod'  => 1,
              'nome' => 'Item A',
              'tree' => '1.001'
];

$dados[1] = [ 'cod'  => 2,
              'nome' => 'Item B',
              'tree' => '1.002'
];

$dados[2] = [ 'cod'  => 3,
              'nome' => 'Sub-Item A',
              'tree' => '1.001.001'
];

foreach ( $dados as $v ) {
    $tree  = explode ( '.', $v['tree'] );
    $total = count ( $tree );
    switch ( $total ) {
        case 1:
            $data[$tree[0]] = array (
                'cod'  => $v['cod'],
                'nome' => $v['nome']
            );
            break;
        case 2:
            $data[$tree[0]][$tree[1]] = array (
                'cod'  => $v['cod'],
                'nome' => $v['nome']
            );
            break;
        case 3:
            $data[$tree[0]][$tree[1]][$tree[2]] = array (
                'cod'  => $v['cod'],
                'nome' => $v['nome']
            );
            break;
        case 4:
            $data[$tree[0]][$tree[1]][$tree[2]][$tree[3]] = array (
                'cod'  => $v['cod'],
                'nome' => $v['nome']
            );
            break;
        case 5:
            $data[$tree[0]][$tree[1]][$tree[2]][$tree[3]][$tree[4]] = array (
                'cod'  => $v['cod'],
                'nome' => $v['nome']
            );
            break;
        case 6:
            $data[$tree[0]][$tree[1]][$tree[2]][$tree[3]][$tree[4]][$tree[5]] = array (
                'cod'  => $v['cod'],
                'nome' => $v['nome']
            );
            break;
        case 7:
            $data[$tree[0]][$tree[1]][$tree[2]][$tree[3]][$tree[4]][$tree[5]][$tree[6]] = array (
                'cod'  => $v['cod'],
                'nome' => $v['nome']
            );
            break;
        default:
            break;

    }

}

var_dump ( $data );

?>
foreach ( $dados as $v ) {
    $tree  = explode ( '.', $v['tree'] );
                                         // You can think about $p as a pointer
    $p = &$data;                         // now it point to root of array 
    foreach($tree as $i) {
       if (!isset($p[$i])) $p[$i] = '';  // if item is not present, create it
       $p = &$p[$i];                     // change pointer to this item of array, 
                                         // so $p will be $data[$tree[0]], then $data[$tree[1]]...
       }                                 // path finished, this is our aim
       $p = array (                      // add array to a leaf
                'cod'  => $v['cod'],     
                'nome' => $v['nome']
           );
}

var_dump ( $data );

@ splash58击败了我,但这是我的版本:

foreach($dados as $v){
    $tree           = explode ( '.', $v['tree'] );
    $arrayElement   = array('cod'  => $v['cod'],'nome' => $v['nome']);
    $arrayHolder    = &$data;
    foreach($tree as $key){
        $arrayHolder[$key] = isset($arrayHolder[$key]) ? $arrayHolder[$key] : array();
        $arrayHolder = &$arrayHolder[$key];
    }
    $arrayHolder = $arrayElement;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM