tdammers / aquery
0.3
2014-04-17 11:07 UTC
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-09-10 04:40:40 UTC
README
宽松的遍历对象和数组
安装方法
到目前为止,最简单的方法是使用 composer 从 packagist 安装 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.");