krugozor/cover

此包最新版本(0.0.5)没有可用的许可证信息。

PHP 数组对象

0.0.5 2023-12-18 11:52 UTC

This package is auto-updated.

Last update: 2024-09-18 13:35:09 UTC


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"
}