【问题标题】:Get the correct loop for/foreach为/foreach 获取正确的循环
【发布时间】:2014-04-09 18:40:17
【问题描述】:

我有一个带有子类别的类别。我想创建一个链接,但子类别应显示在类别下。

我的数据库的以下代码/结果:

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 循环?或者不能用这个数组做子类别?

【问题讨论】:

  • 你要找的序列的逻辑是什么?
  • 我更新了我的帖子。谢谢

标签: php loops for-loop foreach


【解决方案1】:

这里有一段代码可以做你想做的事,它不是太优雅,但它会完成工作。

基本上它会创建一个嵌套数组,其中类别 ID 是数组键,类别 ID、名称以及子类别('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 数组以了解结构。

【讨论】:

  • 对我来说看起来很完美!谢谢!
  • 你也有一个代码,所以在排序后我可以按字母顺序排列数组吗?当然对于每个维度,我都应该这样做。
  • @craphunter,我已经更新了答案,包括按“名称”键按字母顺序排序。层次顺序仍应保留...在部署之前务必进行测试。 :)
  • 完美!只是不能在 PHP 5.3 中的 sortByNameKeys 中调用函数 compareNames。但我在这里得到了答案:stackoverflow.com/questions/2699086/…。再次感谢!完美运行!!!
  • @craphunter,你确定吗?它应该由 sortByNameKeys() 中的 uasort() 函数调用...您无需手动调用它。无论哪种情况,很高兴我能提供帮助。
猜你喜欢
  • 2015-07-04
  • 2017-11-24
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2012-04-07
  • 2013-11-18
相关资源
最近更新 更多