Array 辅助函数

Array 辅助函数提供了几个函数来简化数组的更复杂用法。它不打算重复 PHP 提供的任何现有功能 - 除非是为了极大地简化它们的用法。

加载此辅助函数

使用以下代码加载此辅助函数:

<?php

helper('array');

可用函数

以下函数可用:

参数
  • $search (string) – 用点表示法描述如何在数组中搜索的字符串

  • $values (array) – 要搜索的数组

返回

在数组中找到的值,如果没有找到则为 null

返回类型

mixed

该方法允许你使用点表示法在数组中搜索特定键,并允许使用通配符 ‘*’。给定以下数组:

<?php

$data = [
    'foo' => [
        'buzz' => [
            'fizz' => 11,
        ],
        'bar' => [
            'baz' => 23,
        ],
    ],
];

我们可以使用搜索字符串“foo.buzz.fizz”定位’fizz’的值。类似地,可以使用“foo.bar.baz”找到 baz 的值:

<?php

// Returns: 11
$fizz = dot_array_search('foo.buzz.fizz', $data);

// Returns: 23
$baz = dot_array_search('foo.bar.baz', $data);

你可以使用星号作为通配符来替换任何段。找到时,它将搜索所有子节点直到找到它。如果你不知道值,或如果你的值具有数值索引,这很方便:

<?php

// Returns: 23
$baz = dot_array_search('foo.*.baz', $data);

如果数组键包含点,则可以用反斜杠转义键:

<?php

$data = [
    'foo' => [
        'bar.baz' => 23,
    ],
    'foo.bar' => [
        'baz' => 43,
    ],
];

// Returns: 23
$barBaz = dot_array_search('foo.bar\.baz', $data);
// Returns: 43
$fooBar = dot_array_search('foo\.bar.baz', $data);

备注

在 v4.2.0 之前,由于一个 bug, dot_array_search('foo.bar.baz', ['foo' => ['bar' => 23]]) 返回的是 23。v4.2.0 及更高版本返回 null

参数
  • $key (mixed) – 目标键

  • $array (array) – 要搜索的数组

返回

在数组中找到的值,如果没有找到则为 null

返回类型

mixed

从一个深度不确定的数组返回具有键值的元素的值

array_sort_by_multiple_keys(array &$array, array $sortColumns)
参数
  • $array (array) – 要排序的数组(通过引用传递)。

  • $sortColumns (array) – 要排序的数组键及各自的 PHP 排序标志的关联数组

返回

排序是否成功

返回类型

bool

此方法以分层方式根据一个或多个键的值对多维数组的元素进行排序。例如,从某个模型的 find() 函数返回以下数组:

<?php

$players = [
    0 => [
        'name'     => 'John',
        'team_id'  => 2,
        'position' => 3,
        'team'     => [
            'id'    => 1,
            'order' => 2,
        ],
    ],
    1 => [
        'name'     => 'Maria',
        'team_id'  => 5,
        'position' => 4,
        'team'     => [
            'id'    => 5,
            'order' => 1,
        ],
    ],
    2 => [
        'name'     => 'Frank',
        'team_id'  => 5,
        'position' => 1,
        'team'     => [
            'id'    => 5,
            'order' => 1,
        ],
    ],
];

现在按两个键对该数组进行排序。请注意,该方法支持使用点表示法访问更深层数组级别中的值,但不支持通配符:

<?php

array_sort_by_multiple_keys($players, [
    'team.order' => SORT_ASC,
    'position'   => SORT_ASC,
]);

现在 $players 数组已根据每个球员 ‘team’ 子数组中的 ‘order’ 值排序。如果对几个球员此值相等,则这些球员将根据其 ‘position’ 进行排序。结果数组为:

<?php

$players = [
    0 => [
        'name'     => 'Frank',
        'team_id'  => 5,
        'position' => 1,
        'team'     => [
            'id'    => 5,
            'order' => 1,
        ],
    ],
    1 => [
        'name'     => 'Maria',
        'team_id'  => 5,
        'position' => 4,
        'team'     => [
            'id'    => 5,
            'order' => 1,
        ],
    ],
    2 => [
        'name'     => 'John',
        'team_id'  => 2,
        'position' => 3,
        'team'     => [
            'id'    => 1,
            'order' => 2,
        ],
    ],
];

同样,该方法也可以处理对象数组。在上面的示例中,每个 ‘player’ 都可能由一个数组表示,而 ‘teams’ 是对象。该方法将检测每个嵌套级别中的元素类型并相应处理。

array_flatten_with_dots(iterable $array[, string $id = '']) array
参数
  • $array (iterable) – 要打平的多维数组

  • $id (string) – 可选的 ID 以添加到外部键前面。内部使用以展平键。

返回类型

array

返回

打平的数组

此函数使用点作为键的分隔符,将多维数组展平为单个键值对数组。

<?php

$arrayToFlatten = [
    'personal' => [
        'first_name' => 'john',
        'last_name'  => 'smith',
        'age'        => '26',
        'address'    => 'US',
    ],
    'other_details' => 'marines officer',
];

$flattened = array_flatten_with_dots($arrayToFlatten);

检查后, $flattened 等于:

<?php

[
    'personal.first_name' => 'john',
    'personal.last_name'  => 'smith',
    'personal.age'        => '26',
    'personal.address'    => 'US',
    'other_details'       => 'marines officer',
];

用户可以自己使用 $id 参数,但不需要这样做。该函数在内部使用此参数来跟踪展平后的键。如果用户将提供初始 $id,它将添加到所有键前面。

<?php

// using the same data from above
$flattened = array_flatten_with_dots($arrayToFlatten, 'foo_');
/*
 * $flattened is now:
 * [
 *     'foo_personal.first_name' => 'john',
 *     'foo_personal.last_name'  => 'smith',
 *     'foo_personal.age'        => '26',
 *     'foo_personal.address'    => 'US',
 *     'foo_other_details'       => 'marines officer',
 * ]
 */