craigh/jmespath-iterator

使用 Jmespath 访问 PHP 数组,就像访问标准数组一样

v1.0.1 2021-02-11 15:31 UTC

This package is auto-updated.

Last update: 2024-09-12 01:14:58 UTC


README

JmespathIterator 允许您使用 JMESPath 访问 PHP 数组,就像访问标准数组一样。

安装

您可以通过 composer 安装 JmespathIterator

composer require craigh/jmespath-iterator

用法

创建一个新的 JmespathIterator 对象,然后将 JMESPath 表达式作为数组键传递

基本示例

use Humps\Jmespath\JmespathIterator;

$iterator = new JmespathIterator([
  'foo' => [
    'bar' => [
      'baz' => 'qux',
    ],
  ],
]);

echo $iterator['foo.bar.baz']; // output: 'qux'

列表投影示例

use Humps\Jmespath\JmespathIterator;

$iterator = new JmespathIterator([
  'people' =>
    [
      [
        'first' => 'James',
        'last' => 'd',
      ],
      [
        'first' => 'Jacob',
        'last' => 'e',
      ],
      [
        'first' => 'Jayden',
        'last' => 'f',
      ],
      [
        'missing' => 'different',
       ],
    ],
    'foo' =>
      [
        'bar' => 'baz',
      ],
]);

var_dump($iterator['people[*].first']); // output: ["James", "Jacob", "Jayden"]
        

每一级都是 JmespathIterator

JmespathIterator 总是返回 JmespathIterator 对象作为数组,这意味着您可以使用 JMESPath 查询嵌套数组

use Humps\Jmespath\JmespathIterator;

$iterator = new JmespathIterator([
  [
    'foo' => [
      'bar' => 'qux',
    ],
  ],
]);

echo $iterator[0]['foo.bar']; // output: 'qux'

并且可以像标准数组一样遍历它

use Humps\Jmespath\JmespathIterator;

$iterator = new JmespathIterator([
  [
    'bar' => [
      'baz' => 'qux',
    ],
  ],
  [
    'bar' => [
      'baz' => 'qux',
    ],
  ],
]);

if(count($iterator)){
  foreach ($iterator as $value) {
    echo $value['bar.baz'];
  }
}

像数组一样添加项

JmespathIterator 实现了 ArrayAccess 接口,因此您可以像通常一样添加数组值

use Humps\Jmespath\JmespathIterator;

$iterator = new JmespathIterator();
$iterator[] = 'foo';
$iterator[] = 'bar';

echo $iterator[1] // output: 'bar';

切片

为了使事情更简洁,您不需要在切片表达式中使用方括号,但如果愿意的话也可以使用

use Humps\Jmespath\JmespathIterator;

$iterator = new JmespathIterator(['foo','bar','baz','qux', 'qux']);

var_dump($iterator['0::2']); // outputs: ['foo', 'baz', 'qux']
var_dump($iterator['[0::2]']); // outputs: ['foo', 'baz', 'qux']

记住:它实际上并不是数组!

虽然 JmespathIterator 对象可能感觉像一个数组,但它不是;但如果需要,您可以使用 toArray() 方法

use Humps\Jmespath\JmespathIterator;

$iterator = new JmespathIterator(['foo','bar','baz','qux', 'quxx']);
$array = $iterator->toArray();
natsort($array);
$newIterator = new JmespathIterator($array); 
var_dump($newIterator); // outputs: ['bar', 'baz','foo', 'qux', 'quxx']