我经常使用多维关联数组,主要用于配置数据,并将"面包屑"引入到多维数组的使用中。其基本思想是:我的类被设计用来处理一维(平面)面包屑数组,作为多维关联数组中某些值的参考指南。breadcrumb的每一个增量索引基本上都在数组内部更深一层,直到找到并递归到达最后一层和关联键。例如:
$myArray = array(
'firstLevel' => array(
'secondLevel' => array(
'myValue' => 42
),
'anotherLevel' => array(
'anotherValue' => 13
)
)
);
$myBreadcrumb = array('firstLevel', 'secondLevel', 'myValue');
$fancyClass = new someNamespacefancyArrayProcessingClass($myArray);
$myValue = $fancyClass->getValueForBreadcrumb($myBreadcrumb);
如果它被请求,我将发布一个例子的面包屑的处理,太,但因为我的目标是自定义数据类型,我发现它是离题。总是编写"包装器"类、实现类或其他类型的构造来使数组可以通过breadcrumb导航,这变得越来越令人厌倦,而且开销很大。我想知道是否有一种方法可以将真正的新数据类型引入PHP,使其可以像实际的数据类型一样处理。我认为这个概念的好语法是:
$myArray = navigableArray(
'firstLevel' => array(
'secondLevel' => array(
'myValue' => 42
),
'anotherLevel' => array(
'anotherValue' => 13
)
)
);
$myBreadcrumb = array('firstLevel', 'secondLevel', 'myValue');
$myValue = $myArray[$myBreadcrumb];
或者更直观地使用xpath样式的字符串:
$myArray = navigableArray(
'firstLevel' => array(
'secondLevel' => array(
'myValue' => 42
),
'anotherLevel' => array(
'anotherValue' => 13
)
)
);
$myValue = $myArray['firstLevel/secondLevel/myValue'];
我知道PHP文档中有一句话说"开发人员永远不需要在PHP中引入自己的数据类型",但是据我所知,没有理由说明为什么会这样,也没有理由说明为什么开发人员(与几乎所有其他语言不同)无法引入完全自定义的数据类型。
编辑:对于任何好奇的人:我发现了另一种方法,使用标准的php类"ArrayAccess",你可以使你的php对象表现得像一个实际的数组。著名的"Judy"类包含了"ArrayAccess"one_answers"Iterator",正好符合我在这个问题线程中所寻找的。
http://php.net/manual/de/class.arrayaccess.php http://php.net/manual/de/class.judy.php根据您的用例,我建议您查看PHP的SPL迭代器。特别是递归迭代器接口或RecursiveArrayIterator实现。这些迭代器是内置在PHP中的,速度非常快,并且许多允许您使用原生PHP函数(如foreach(), for(), count()等)访问它们。
然后您可以扩展SPL Iterator接口之一来创建您自己的定制类,为您的Breadcrumb需求提供特定的功能。顺便说一下,我认为开发人员确实不应该在PHP中创建自己的本地数据类型(因为你不能),但强烈建议使用PHP类创建自定义类型,而不是使用本地数组。