tdammers/aquery

宽松的嵌套数组和对象的遍历

0.3 2014-04-17 11:07 UTC

This package is not auto-updated.

Last update: 2024-09-10 04:40:40 UTC


README

宽松的遍历对象和数组

安装方法

到目前为止,最简单的方法是使用 composerpackagist 安装 AQuery。该软件包可以在 这里 找到。

请参阅 composer 文档以获取安装说明;AQuery 类位于 AQuery 命名空间中,即 \AQuery\AQuery

如果您想查看源代码,请访问 bitbucket 仓库

它能做什么

AQuery 为对象、数组和 ArrayAccess 对象提供统一的查询接口。它封装了以下常见模式

if (isset($array['foo']['bar']['baz'])) {
    return $array['foo']['bar']['baz'];
}
else {
    return $defValue;
}

注意以下代码示例违反了 DRY 原则:进入嵌套数组的路径出现了两次。这意味着如果我们想更改它,我们必须更改两次,如果我们其中一次出错,我们可能会遇到奇怪的错误。然而,因为 isset 是语言结构,而不是函数,我们不能合并这两个语句。以下将不起作用

if (isset($value = $array['foo']['bar']['baz'])) {
    return $value;
}
else {
    return $defValue;
}

这个也不会

$value = $array['foo']['bar']['baz'];
if (isset($value)) {
    return $value;
}
else {
    return $defValue;
}

AQuery 提供了一种很好的解决方案,并附带一种超级简单的查询语言。以下是上述示例使用 AQuery 的样子

return AQuery::query('foo/bar/baz', $array, $defValue);

这不仅会深入到我们的数组中,而且如果查询未解决,它还会优雅地失败,并返回默认值,无论在哪个级别(即,如果 $array['foo'] 不包含 'bar' 键,AQuery 会短路并返回默认值,而不是抛出警告或崩溃)。

AQuery 不仅适用于关联数组,也适用于数字数组、普通对象(请注意,如果您实现 __get(),则必须为相同的键提供合适的 __isset(),否则 AQuery 将看不到由此定义的魔术属性),以及实现 ArrayAccess 的对象。

基本用法示例

<?php
use \AQuery\AQuery;

$myArray = array(
              'foo' => array(
                  'bar' => array(
                      'baz' => 'quux')));
echo AQuery::query('foo/bar/baz', $myArray);
// Or, equivalent:
echo AQuery::query(array('foo', 'bar', 'baz'), $myArray);

// For more control, or if you want to run the same query over several
// input data structures, instantiate an AQuery object explicitly:
$aquery = new AQuery('foo/bar/baz');

// Or, equivalent (overriding the separator character):
$aquery = new AQuery('foo:bar:baz', ':');
$aquery->run($myArray, "Sorry, didn't find a thing.");