alleyinteractive / traverse-reshape
安全地分解数组或对象,并以新的形状重新组合。
v2.0.0
2022-12-29 19:25 UTC
Requires
- php: ^8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.8
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.6
README
traverse()
和 reshape()
是一对伴随函数,用于安全地分解数组或对象,并以新的形状重新组合。
安装
使用以下命令安装最新版本:
$ composer require alleyinteractive/traverse-reshape
基本用法
traverse
使用分隔符遍历数组或对象以找到单个值或多个值。
<?php $arr = [ 'apples' => [ 'red' => [ 'gala', 'mcintosh', ], 'green' => [ 'granny_smith', ], ], ]; $obj = (object) [ 'apples' => (object) [ 'red' => [ 'gala', 'mcintosh', ], 'green' => [ 'granny_smith', ], ], ]; $green = \Alley\traverse($arr, 'apples.green'); // ['granny_smith'] $red = \Alley\traverse($obj, 'apples.red'); // ['gala', 'mcintosh'] [$red, $green] = \Alley\traverse($obj, ['apples.red', 'apples.green']); // ['gala', 'mcintosh'], ['granny_smith'] [[$red, $green]] = \Alley\traverse( $obj, [ 'apples' => [ 'red', 'green', ], ], ); // ['gala', 'mcintosh'], ['granny_smith'] // note the extra depth of the return value -- values are nested according to the nesting of the given paths [$red] = \Alley\traverse($obj, ['apples' => 'red']); // ['gala', 'mcintosh'] $sweet = \Alley\traverse($arr, 'apples.green.sweet'); // NULL $pears = \Alley\traverse($arr, 'pears'); // NULL $req = getRemoteData(); [$title, $date] = \Alley\traverse($req, ['title', 'date']); // $title and $date variables are guaranteed defined regardless of $req [[$red, $green], $title] = \Alley\traverse( [$arr, $req], [ '0.apples' => ['red', 'green'], '1.title', ] );
reshape
声明一个新的数组或对象的形状,其值通过 traverse()
从源数组或对象中提取。
形状可以是多维的。在源中无法解析的路径在结果中将显示为 null
。如果给定一个没有键的路径,则键将根据路径推断。传递一个对象作为形状将返回一个对象而不是数组。
<?php $original = [ 'id' => 1, 'title' => [ 'rendered' => 'Hello world!', ], 'content' => [ 'rendered' => '<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!</p>', ], 'categories' => [1], 'tags' => [], '_links' => [ 'self' => [ [ 'href' => 'https://www.example.com/wp-json/wp/v2/posts/1', ], ], ], ]; \Alley\reshape( $original, [ 'title' => 'title.rendered', 'dek' => 'meta.dek', 'content.rendered', 'term_ids' => (object) [ 'category' => 'categories', 'post_tag' => 'tags', ], 'json' => '_links.self.0.href', ] ); /* [ 'title' => 'Hello world!', 'dek' => NULL, 'rendered' => '<p>Welcome to WordPress...', 'term_ids' => (object) [ 'category' => [1], 'post_tag' => [], ], 'json' => 'https://www.example.com/...', ] */