我有子类别的类别。我想建立链接,但子类别应显示在类别下。
关注我的数据库的代码/结果:
foreach ($v as $k1 => $v1) {
print_r ($v1); echo ' <br />';
}
跟进结果:
Array ( [head] => 1 [category_id] => 5 [category] => colors [module_id] => 2 )
Array ( [head] => 1 [category_id] => 6 [category] => floors [module_id] => 2 )
Array ( [head] => 5 [category_id] => 7 [category] => wandfarbe [module_id] => 2 )
Array ( [head] => 5 [category_id] => 8 [category] => bodenfarbe [module_id] => 2 )
Array ( [head] => 6 [category_id] => 9 [category] => parkett [module_id] => 2 )
是否有可能获得或回应结果:
1 | 5
5 | 7
5 | 8
8 | 10
8 | 11
1 | 6
6 | 9
我是否需要做一个for循环或foreach循环?或者是不可能用这个数组做子类别?
答案 0 :(得分:1)
这里有一些代码可以做你想要的,它不是太优雅,但它会完成工作。
基本上它会创建一个嵌套数组,其中Category ID是数组键,Category Id,Name以及子类别('cats')是该级别的值。
在下面的示例中, $ hier 是包含类别层次结构的数组。
// Check each level of $hier for a key with 'head' value
// if found, add cat id under it, otherwise return false
function findPlace(&$hier, $data)
{
// check for existing position on top level
foreach ($hier as $level => $cats) {
if ($level == $data['head']) {
// the category belongs here
$hier[$level]['cats'][$data['category_id']] = array(
'id' => $data['category_id'],
'name' => $data['category']
);
return true;
}
}
// if not found, check next level down if array
foreach ($hier as $level => $cats) {
if (is_array($cats)) {
return findPlace($hier[$level], $data);
}
}
// did not find a place in hierarchy
return false;
}
// create new entry
function createPlace(&$hier, $data)
{
$hier[$data['head']]['id'] = $data['head'];
$hier[$data['head']]['cats'][$data['category_id']] = array(
'id' => $data['category_id'],
'name' => $data['category']
);
}
然后,既然您表示要使用类别名称(按字母顺序)重新排序,则可以添加以下函数来进行排序:
// case insensitive string compare for alpha sort
function compareNames($a, $b)
{
return strcasecmp($a['name'], $b['name']);
}
// sort array alphabetically by 'name' key
function sortByNameKeys(&$hier) {
foreach ($hier as $key => $sub) {
if (isset($sub['cats']) && !empty($sub['cats'])){
sortByNameKeys($hier[$key]['cats']);
uasort($hier[$key]['cats'], 'compareNames');
}
}
}
现在你需要做的就是整理你的类别层次结构是循环你的记录(类别)并调用findPlace()函数,这是一个例子:
$hier = array(); // category hierarchy will be saved here
foreach ($records as $record) {
findPlace($hier, $record) || createPlace($hier, $record);
}
sortByNameKeys($hier); // re-sort by name, keeping hierarchy
希望有所帮助!
将此代码复制/粘贴到php文件中,运行它然后var_dump $ hier 数组以了解结构。