【问题标题】:PHP - Return array of parents from multidimensional associative array for breadcrumb listPHP - 从面包屑列表的多维关联数组返回父数组
【发布时间】:2012-12-10 20:34:11
【问题描述】:

我正在尝试从数组创建动态面包屑。所以我可以添加到数组中,而不必手动更新面包屑。

好的,这是我的数组的一个 sn-p:(不会更深入)

$menu = array(
    'Dashboard' => array(
        'Projects' => array(
            'Project 1' => array(
                'Project settings' => 'projects/project_1/settings',
                'Issue Tracker' => 'projects/project_1/issue_tracker',
                'Customize page' => 'projects/project_1',
                'Manage files' => 'projects/project_1/files',
            ),
            'Project 2' => array(
                'Project settings' => 'projects/project_2/settings',
                'Issue Tracker' => 'projects/project_2/issue_tracker',
                'Customize page' => 'projects/project_2',
                'Manage files' => 'projects/project_2/files',
            ),
        ),
        'Logout' => '#',
    )
);

我希望能够以以后可以迭代的方式返回任何键的所有父项。例如,对于“项目设置”:

'Dashboard','Projects','Project 1'.

【问题讨论】:

  • 我现在只能说,这个问题之前已经在网站上提出过并得到了回答。让我看看能不能帮你把它从档案里拿出来。
  • 快速浏览了一下。那里很好,但这不只是反转数组吗?我将如何隔离我正在寻找的密钥的父母?

标签: php arrays breadcrumbs associative multidimensional-array


【解决方案1】:

在您的示例中,实际上有两种可能的路径:

Key 'Project settings' found: 'Projects' -> 'Project 1'
Key 'Project settings' found: 'Projects' -> 'Project 2'

您可以使用递归迭代器轻松解决此问题(请参阅RecursiveIteratorIterator,它提供了您所需要的一切)。我选择它是因为它可以让您更轻松地搜索和获取父级别键:

$search = 'Project settings';
$it     = new ParentKeysIterator($menu);
foreach ($it as $key) {
    if ($key !== $search) continue;
    printf("Key '%s' found: '%s'\n", $key, implode("' -> '", $it->key()));
}

还有ParentKeysIterator

class ParentKeysIterator extends RecursiveIteratorIterator
{
    public function __construct(array $array) {
        parent::__construct(new  RecursiveArrayIterator($array));
    }

    public function current() {
        return parent::key();
    }

    public function key() {
        return $this->getParentKeys();
    }


    public function getParentKeys() {
        $keys = [];
        for ($depth = $this->getDepth() - 1; $depth; $depth--) {
            array_unshift($keys, $this->getSubIterator($depth)->key());
        }
        return $keys;
    }
}

【讨论】:

  • 哇,谢谢。这看起来很不错。您确定没有外部课程就不可能吗?我不喜欢仅仅为了一两个功能而依赖整个类 - 让它看起来臃肿......
  • 这些类是 PHP 内置的。您自己编写的第三节课不是外部的。如果您想要每个功能,请检查我链接的另一个问题。然后你需要编写你自己的 RecursiveIteratorIterator 中已经存在的整个逻辑,这将重新发明轮子,这是你通常不想做的事情。
  • 我做了一个调整:for 循环应该是for ($depth = $this->getDepth(); $depth>=0; $depth--),这样它就可以正确地返回在最顶层(本例中为“仪表板”)找到的键。
  • @N13:对于最上面的键,您不需要循环,它始终是:$this->getSubIterator($depth = 0)->key();(其中的变量仅用于命名值)。
  • @hakre:在这个例子中,是的。不过,它不适用于我的数据结构,所以我想分享一个更广泛的解决方案。当您在这里时,您是否知道使用返回的 $keys 数组从 $menu 中检索值的方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多