krugozor / cover
此包最新版本(0.0.5)没有可用的许可证信息。
PHP 数组对象
0.0.5
2023-12-18 11:52 UTC
Requires
- php: >=8.0
Requires (Dev)
- phpunit/phpunit: ^10.3
README
CoverArray
是一个基本类,用于在面向对象的方式下方便灵活地处理数组。实际上,这是一个“对象数组”,PHP 中非常需要这种类型。
它是如何工作的?
您可以创建一个从 CoverArray
继承的类,或者在不继承的情况下使用 CoverArray
。让我们创建一个新的类,这个类继承自基本类 CoverArray
class NewTypeArray extends CoverArray {}
注意:在以下示例中,以及在实际测试中,我们使用了从 CoverArray
继承的 NewTypeArray
数据类型。这是为了演示此解决方案的灵活性。在程序中可以有多个从 CoverArray
继承的类型,它们在概念上可能有所不同。例如,CoverArray
类型的对象可以用作“对象数组”,以替代标准 array
在日常工作中,而任何其他从 CoverArray
继承的类型可以充当 DTO 或独立的数据类型,以防止“踢到铁板”。
function foo(NewTypeArray $data) {}
实例化该类的新对象。向构造函数传递多维数组,并查看得到的结构。
$data = new NewTypeArray([ 'firstName' => 'Vasiliy', 'lastName' => 'Ivanov', 'langs' => [ 'backend' => ['PHP', 'MySql'], 'frontend' => ['HTML', 'CSS1', 'JavaScript', 'CSS2', 'CSS3'] ], ]); var_dump($data);
结果
object(Krugozor\Cover\Tests\NewTypeArray)#4 (1) {
["data":protected]=>
array(3) {
["firstName"]=>
string(7) "Vasiliy"
["lastName"]=>
string(6) "Ivanov"
["langs"]=>
object(Krugozor\Cover\Tests\NewTypeArray)#5 (1) {
["data":protected]=>
array(2) {
["backend"]=>
object(Krugozor\Cover\Tests\NewTypeArray)#6 (1) {
["data":protected]=>
array(2) {
[0]=>
string(3) "PHP"
[1]=>
string(5) "MySql"
}
}
["frontend"]=>
object(Krugozor\Cover\Tests\NewTypeArray)#7 (1) {
["data":protected]=>
array(5) {
[0]=>
string(4) "HTML"
[1]=>
string(5) "CSS1"
[2]=>
string(10) "JavaScript"
[3]=>
string(5) "CSS2"
[4]=>
string(4) "CSS3"
}
}
}
}
}
}
如上图所示,所有传递给构造函数的数组都递归地转换为 NewTypeArray
类型的对象。这种行为保证任何进入存储的数组都将获得当前类类型的“封装”(cover)。所有创建的对象的数据都整洁地收集到受保护的属性 $data
中,这提供了数据封装和实现任何方法的能力。
让我们尝试操作上面创建的对象的数据。
示例
$value = $data ->get('langs.frontend') ->filter(function ($value) { return preg_match('~CSS~', $value); }) ->implode(', '); var_dump($value);
结果
string(18) "CSS1, CSS2, CSS3"
示例
$value = $data ->get('langs.frontend') ->append('HTML 5', 'jQuey') ->getDataAsArray(); var_dump($value);
结果
array(7) {
[0]=>
string(4) "HTML"
[1]=>
string(5) "CSS1"
[2]=>
string(10) "JavaScript"
[3]=>
string(5) "CSS2"
[4]=>
string(4) "CSS3"
[5]=>
string(6) "HTML 5"
[6]=>
string(5) "jQuey"
}
示例
var_dump($data['langs']['backend'][0]); var_dump($data->langs->backend->item(0)); var_dump($data->get('langs.backend.0')); var_dump($data->get('langs')->item('backend')[0]); var_dump($data->get('langs')['backend']->item(0));
结果
string(3) "PHP"
string(3) "PHP"
string(3) "PHP"
string(3) "PHP"
string(3) "PHP"
示例
var_dump($data->get('langs.backend')->getFirst()); var_dump($data->get('langs.backend')->getLast());
结果
string(3) "PHP"
string(5) "MySql"
示例
var_dump(serialize($data->get('langs.backend')));
结果
string(75) "O:33:"Krugozor\Cover\Tests\NewTypeArray":2:{i:0;s:3:"PHP";i:1;s:5:"MySql";}"
示例
$value = $data->get('langs')->mapAssociative(function (string $key, CoverArray $langs) { return sprintf( "\n<ul>\n %s (%s):\n%s\n</ul>", $key, $langs->count(), $langs->map(fn(string $lang): string => " <li>$lang</li>")->implode(PHP_EOL) ); })->implode(''); var_dump($value);
结果
string(190) "
<ul>
backend (2):
<li>PHP</li>
<li>MySql</li>
</ul>
<ul>
frontend (5):
<li>HTML</li>
<li>CSS1</li>
<li>JavaScript</li>
<li>CSS2</li>
<li>CSS3</li>
</ul>"
示例
$value = NewTypeArray::fromExplode(',', '1,1,2,1,2,2,1,,1,,,2') ->unique() ->filter() ->implode(','); var_dump($value);
结果
string(3) "1,2"
示例
var_dump($data->get('langs.backend')->getDataAsArray()); var_dump($data->get('langs.backend')->reverse()->getDataAsArray());
结果
array(2) {
[0]=>
string(3) "PHP"
[1]=>
string(5) "MySql"
}
array(2) {
[0]=>
string(5) "MySql"
[1]=>
string(3) "PHP"
}