【问题标题】:PHP custom DataType for multidimensional arrays用于多维数组的 PHP 自定义 DataType
【发布时间】:2014-08-29 03:00:43
【问题描述】:

我经常使用多维、关联数组,主要用于配置数据,并在多维数组的使用中引入了“面包屑”。 基本思想:我的类旨在处理一维(平面)面包屑数组,作为多维关联数组中某些值的参考指南。面包屑的每个递增索引基本上是数组内部的一个更深的级别,直到找到最后一个级别和关联键并以递归方式到达。例如:

$myArray = array(
  'firstLevel' => array(
    'secondLevel' => array(
      'myValue' => 42
    ),
    'anotherLevel' => array(
      'anotherValue' => 13
    )
  )
);
$myBreadcrumb = array('firstLevel', 'secondLevel', 'myValue');
$fancyClass = new \someNamespace\fancyArrayProcessingClass($myArray);
$myValue = $fancyClass->getValueForBreadcrumb($myBreadcrumb);

如果有人要求,我也会发布一个处理面包屑的示例,但由于我的目标是自定义数据类型,我发现它离题了。 总是编写“包装器”类、实现的类或其他类型的构造以使数组可通过面包屑导航变得越来越烦人并且开销很大。我想知道是否有一种方法可以将真正的新 DataTypes 引入 PHP,可以像实际 DataTypes 一样处理。我对这个概念的好语法的想法:

$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 文档中有一句话说“开发人员永远不需要将自己的 DataTypes 引入 PHP”,但是 AFAIK 没有理由给出为什么会这样以及为什么开发人员是 -与几乎所有其他语言不同 - 无法引入完全自定义的数据类型。

编辑: 对于任何好奇的人:我找到了一条替代路线,使用标准 php 类“ArrayAccess”,您可以使您的 PHP 对象表现得像一个实际的数组。著名的“Judy”类包含“ArrayAccess”和“Iterator”,并且完全符合我在这个问题线程中寻找的内容。

http://php.net/manual/de/class.arrayaccess.php

http://php.net/manual/de/class.judy.php

【问题讨论】:

    标签: php multidimensional-array reference associative-array custom-data-type


    【解决方案1】:

    根据您的用例,我建议您查看 PHP 的 SPL 迭代器。特别是Recursive Iterator 接口或RecursiveArrayIterator 实现。这些迭代器是原生内置于 PHP 中的,速度非常快,并且许多允许您使用原生 PHP 函数(例如 foreach()、for()、count() 等)来访问它们。

    然后您可以扩展 SPL 迭代器接口之一来创建您自己的自定义类,该类为您提供特定于您的面包屑需求的功能。 FWIW,我认为开发人员确实不应该在 PHP 中创建自己的 native 数据类型(因为你不能),但是强烈建议使用 PHP 类创建自定义类型而不是使用原生数组。

    【讨论】:

    • 非常感谢,这解决了必须更改语法并在引用访问中添加另一层抽象的问题,这最终只会使其他程序员感到困惑,而不是帮助逻辑。使用 RecursiveArrayIterator,我至少可以创建一个可以在所有项目中传递的标准化解决方案。
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2013-02-04
    • 2012-02-16
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多