[英]Is there a better way to write the logic of this code?
我将获得$dados
表单数据库,每个元素将具有3个信息cod
, nome
, tree
。
该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.