类 yii\helpers\BaseArrayHelper
继承 | yii\helpers\BaseArrayHelper |
---|---|
子类 | yii\helpers\ArrayHelper |
可用版本 | 2.0 |
源代码 | https://github.com/yiisoft/yii2/blob/master/framework/helpers/BaseArrayHelper.php |
BaseArrayHelper 为 yii\helpers\ArrayHelper 提供具体的实现。
不要使用 BaseArrayHelper。请使用 yii\helpers\ArrayHelper 替代。
公共方法
方法详情
根据指定的规则过滤数组。
例如
$array = [
'A' => [1, 2],
'B' => [
'C' => 1,
'D' => 2,
],
'E' => 1,
];
$result = \yii\helpers\ArrayHelper::filter($array, ['A']);
// $result will be:
// [
// 'A' => [1, 2],
// ]
$result = \yii\helpers\ArrayHelper::filter($array, ['A', 'B.C']);
// $result will be:
// [
// 'A' => [1, 2],
// 'B' => ['C' => 1],
// ]
$result = \yii\helpers\ArrayHelper::filter($array, ['B', '!B.C']);
// $result will be:
// [
// 'B' => ['D' => 2],
// ]
public static array filter ( $array, $filters ) | ||
$array | array |
源数组 |
$filters | 可迭代对象 |
定义应保留或从结果中删除的数组键的规则。每个规则都是
|
返回值 | array |
已过滤的数组 |
---|
public static function filter($array, $filters)
{
$result = [];
$excludeFilters = [];
foreach ($filters as $filter) {
if (!is_string($filter) && !is_int($filter)) {
continue;
}
if (is_string($filter) && strncmp($filter, '!', 1) === 0) {
$excludeFilters[] = substr($filter, 1);
continue;
}
$nodeValue = $array; //set $array as root node
$keys = explode('.', (string) $filter);
foreach ($keys as $key) {
if (!array_key_exists($key, $nodeValue)) {
continue 2; //Jump to next filter
}
$nodeValue = $nodeValue[$key];
}
//We've found a value now let's insert it
$resultNode = &$result;
foreach ($keys as $key) {
if (!array_key_exists($key, $resultNode)) {
$resultNode[$key] = [];
}
$resultNode = &$resultNode[$key];
}
$resultNode = $nodeValue;
}
foreach ($excludeFilters as $filter) {
$excludeNode = &$result;
$keys = explode('.', (string) $filter);
$numNestedKeys = count($keys) - 1;
foreach ($keys as $i => $key) {
if (!array_key_exists($key, $excludeNode)) {
continue 2; //Jump to next filter
}
if ($i < $numNestedKeys) {
$excludeNode = &$excludeNode[$key];
} else {
unset($excludeNode[$key]);
break;
}
}
}
return $result;
}
返回数组中指定列的值。
输入数组应为多维数组或对象数组。
例如,
$array = [
['id' => '123', 'data' => 'abc'],
['id' => '345', 'data' => 'def'],
];
$result = ArrayHelper::getColumn($array, 'id');
// the result is: ['123', '345']
// using anonymous function
$result = ArrayHelper::getColumn($array, function ($element) {
return $element['id'];
});
public static array getColumn ( $array, $name, $keepKeys = true ) | ||
$array | array | |
$name | integer|string|array|Closure | |
$keepKeys | boolean |
是否保留数组键。如果为 false,则结果数组将使用整数重新索引。 |
返回值 | array |
列值的列表 |
---|
public static function getColumn($array, $name, $keepKeys = true)
{
$result = [];
if ($keepKeys) {
foreach ($array as $k => $element) {
$result[$k] = static::getValue($element, $name);
}
} else {
foreach ($array as $element) {
$result[] = static::getValue($element, $name);
}
}
return $result;
}
检索数组元素或对象属性的值,使用给定的键或属性名称。
如果数组中不存在该键,则将返回默认值。在从对象获取值时不会使用。
该键可以用点格式指定,以检索子数组的值或嵌入对象的属性。特别是,如果键是 x.y.z
,则返回值将是 $array['x']['y']['z']
或 $array->x->y->z
(如果 $array
是一个对象)。如果 $array['x']
或 $array->x
既不是数组也不是对象,则将返回默认值。请注意,如果数组中已经有一个元素 x.y.z
,那么将返回它的值,而不是遍历子数组。因此,最好通过指定键名称的数组来完成,例如 ['x', 'y', 'z']
。
以下是一些使用示例,
// working with array
$username = \yii\helpers\ArrayHelper::getValue($_POST, 'username');
// working with object
$username = \yii\helpers\ArrayHelper::getValue($user, 'username');
// working with anonymous function
$fullName = \yii\helpers\ArrayHelper::getValue($user, function ($user, $defaultValue) {
return $user->firstName . ' ' . $user->lastName;
});
// using dot format to retrieve the property of embedded object
$street = \yii\helpers\ArrayHelper::getValue($users, 'address.street');
// using an array of keys to retrieve the value
$value = \yii\helpers\ArrayHelper::getValue($versions, ['1.0', 'date']);
public static mixed getValue ( $array, $key, $default = null ) | ||
$array | array|object |
要从中提取值的数组或对象 |
$key | string|Closure|array |
数组元素的键名,键的数组或对象的属性名,或返回值的匿名函数。匿名函数签名应为: |
$default | 混合 |
如果指定的数组键不存在,则返回的默认值。从对象获取值时不使用。 |
返回值 | 混合 |
如果找到元素的值,否则为默认值 |
---|
public static function getValue($array, $key, $default = null)
{
if ($key instanceof \Closure) {
return $key($array, $default);
}
if (is_array($key)) {
$lastKey = array_pop($key);
foreach ($key as $keyPart) {
$array = static::getValue($array, $keyPart);
}
$key = $lastKey;
}
if (is_object($array) && property_exists($array, $key)) {
return $array->$key;
}
if (static::keyExists($key, $array)) {
return $array[$key];
}
if ($key && ($pos = strrpos($key, '.')) !== false) {
$array = static::getValue($array, substr($key, 0, $pos), $default);
$key = substr($key, $pos + 1);
}
if (static::keyExists($key, $array)) {
return $array[$key];
}
if (is_object($array)) {
// this is expected to fail if the property does not exist, or __get() is not implemented
// it is not reliably possible to check whether a property is accessible beforehand
try {
return $array->$key;
} catch (\Exception $e) {
if ($array instanceof ArrayAccess) {
return $default;
}
throw $e;
}
}
return $default;
}
将字符串数组中的 HTML 实体解码为相应的字符。
默认情况下,只有数组值将被解码。如果一个值是一个数组,此方法也会递归地解码它。只有字符串值会被解码。
另请参见 https://php.ac.cn/manual/en/function.htmlspecialchars-decode.php.
public static array htmlDecode ( $data, $valuesOnly = true ) | ||
$data | array |
要解码的数据 |
$valuesOnly | boolean |
是否只解码数组值。如果为 |
返回值 | array |
解码后的数据 |
---|
public static function htmlDecode($data, $valuesOnly = true)
{
$d = [];
foreach ($data as $key => $value) {
if (!$valuesOnly && is_string($key)) {
$key = htmlspecialchars_decode($key, ENT_QUOTES | ENT_SUBSTITUTE);
}
if (is_string($value)) {
$d[$key] = htmlspecialchars_decode($value, ENT_QUOTES | ENT_SUBSTITUTE);
} elseif (is_array($value)) {
$d[$key] = static::htmlDecode($value, $valuesOnly);
} else {
$d[$key] = $value;
}
}
return $d;
}
将字符串数组中的特殊字符编码为 HTML 实体。
默认情况下,只有数组值将被编码。如果一个值是一个数组,此方法也会递归地编码它。只有字符串值会被编码。
另请参见 https://php.ac.cn/manual/en/function.htmlspecialchars.php.
public static array htmlEncode ( $data, $valuesOnly = true, $charset = null ) | ||
$data | array |
要编码的数据 |
$valuesOnly | boolean |
是否只编码数组值。如果为 false,则数组键和数组值都将被编码。 |
$charset | string|null |
数据使用的字符集。如果没有设置,将使用 yii\base\Application::$charset。 |
返回值 | array |
编码后的数据 |
---|
public static function htmlEncode($data, $valuesOnly = true, $charset = null)
{
if ($charset === null) {
$charset = Yii::$app ? Yii::$app->charset : 'UTF-8';
}
$d = [];
foreach ($data as $key => $value) {
if (!$valuesOnly && is_string($key)) {
$key = htmlspecialchars($key, ENT_QUOTES | ENT_SUBSTITUTE, $charset);
}
if (is_string($value)) {
$d[$key] = htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, $charset);
} elseif (is_array($value)) {
$d[$key] = static::htmlEncode($value, $valuesOnly, $charset);
} else {
$d[$key] = $value;
}
}
return $d;
}
根据指定的键对数组进行索引和/或分组。
输入应该是多维数组或对象数组。
$key 可以是子数组的键名,对象的属性名,或返回将用作键的值的匿名函数。
$groups 是一个键的数组,它将用于根据指定的键将输入数组分组为一个或多个子数组。
如果 $key
指定为 null
,或者对应于键的元素的值为 null
且 $groups
未指定,则该元素将被丢弃。
例如
$array = [
['id' => '123', 'data' => 'abc', 'device' => 'laptop'],
['id' => '345', 'data' => 'def', 'device' => 'tablet'],
['id' => '345', 'data' => 'hgi', 'device' => 'smartphone'],
];
$result = ArrayHelper::index($array, 'id');
结果将是一个关联数组,其中键是 id
属性的值
[
'123' => ['id' => '123', 'data' => 'abc', 'device' => 'laptop'],
'345' => ['id' => '345', 'data' => 'hgi', 'device' => 'smartphone']
// The second element of an original array is overwritten by the last element because of the same id
]
匿名函数也可以在分组数组中使用。
$result = ArrayHelper::index($array, function ($element) {
return $element['id'];
});
传递 id
作为第三个参数将按 id
对 $array
进行分组
$result = ArrayHelper::index($array, null, 'id');
结果将是一个多维数组,第一级按 id
分组,第二级按 device
分组,第三级按 data
索引
[
'123' => [
['id' => '123', 'data' => 'abc', 'device' => 'laptop']
],
'345' => [ // all elements with this index are present in the result array
['id' => '345', 'data' => 'def', 'device' => 'tablet'],
['id' => '345', 'data' => 'hgi', 'device' => 'smartphone'],
]
]
匿名函数也可以在分组键数组中使用
$result = ArrayHelper::index($array, 'data', [function ($element) {
return $element['id'];
}, 'device']);
结果将是一个多维数组,第一级按 id
分组,第二级按 device
分组,第三级按 data
索引
[
'123' => [
'laptop' => [
'abc' => ['id' => '123', 'data' => 'abc', 'device' => 'laptop']
]
],
'345' => [
'tablet' => [
'def' => ['id' => '345', 'data' => 'def', 'device' => 'tablet']
],
'smartphone' => [
'hgi' => ['id' => '345', 'data' => 'hgi', 'device' => 'smartphone']
]
]
]
public static array index ( $array, $key, $groups = [] ) | ||
$array | array |
需要索引或分组的数组 |
$key | string|Closure|null |
列名或匿名函数,其结果将用于索引数组 |
$groups | string|string[]|Closure[]|null |
将用于按一个或多个键对输入数组进行分组的键数组。如果 $key 属性或其对应于特定元素的值为 null 且 $groups 未定义,则该数组元素将被丢弃。否则,如果指定了 $groups,则数组元素将被添加到结果数组中,没有任何键。此参数从版本 2.0.8 开始可用。 |
返回值 | array |
已索引和/或分组的数组 |
---|
public static function index($array, $key, $groups = [])
{
$result = [];
$groups = (array) $groups;
foreach ($array as $element) {
$lastArray = &$result;
foreach ($groups as $group) {
$value = static::getValue($element, $group);
if (!array_key_exists($value, $lastArray)) {
$lastArray[$value] = [];
}
$lastArray = &$lastArray[$value];
}
if ($key === null) {
if (!empty($groups)) {
$lastArray[] = $element;
}
} else {
$value = static::getValue($element, $key);
if ($value !== null) {
if (is_float($value)) {
$value = StringHelper::floatToString($value);
}
$lastArray[$value] = $element;
}
}
unset($lastArray);
}
return $result;
}
返回一个值,指示给定的数组是否为关联数组。
如果所有键都是字符串,则数组为关联数组。如果 $allStrings
为 false,则如果数组的至少一个键为字符串,则该数组将被视为关联数组。
请注意,空数组将不被视为关联数组。
public static boolean isAssociative ( $array, $allStrings = true ) | ||
$array | array |
正在检查的数组 |
$allStrings | boolean |
为了将数组视为关联数组,数组键是否必须全部为字符串。 |
返回值 | boolean |
数组是否为关联数组 |
---|
public static function isAssociative($array, $allStrings = true)
{
if (empty($array) || !is_array($array)) {
return false;
}
if ($allStrings) {
foreach ($array as $key => $value) {
if (!is_string($key)) {
return false;
}
}
return true;
}
foreach ($array as $key => $value) {
if (is_string($key)) {
return true;
}
}
return false;
}
检查数组或 可遍历对象 是否包含元素。
此方法与 PHP 函数 in_array() 的功能相同,但此外还适用于实现了 Traversable 接口的对象。
public static boolean isIn ( $needle, $haystack, $strict = false ) | ||
$needle | 混合 |
要查找的值。 |
$haystack | 可迭代对象 |
要搜索的值集。 |
$strict | boolean |
是否启用严格 ( |
返回值 | boolean |
如果在 |
---|---|---|
抛出 | yii\base\InvalidArgumentException |
如果 |
public static function isIn($needle, $haystack, $strict = false)
{
if (!static::isTraversable($haystack)) {
throw new InvalidArgumentException('Argument $haystack must be an array or implement Traversable');
}
if (is_array($haystack)) {
return in_array($needle, $haystack, $strict);
}
foreach ($haystack as $value) {
if ($strict ? $needle === $value : $needle == $value) {
return true;
}
}
return false;
}
返回一个值,指示给定的数组是否为索引数组。
如果所有键都是整数,则数组为索引数组。如果 $consecutive
为 true,则数组键必须是从 0 开始的连续序列。
请注意,空数组将被视为索引数组。
public static boolean isIndexed ( $array, $consecutive = false ) | ||
$array | array |
正在检查的数组 |
$consecutive | boolean |
为了将数组视为索引数组,数组键是否必须是连续序列。 |
返回值 | boolean |
数组是否为索引数组 |
---|
public static function isIndexed($array, $consecutive = false)
{
if (!is_array($array)) {
return false;
}
if (empty($array)) {
return true;
}
$keys = array_keys($array);
if ($consecutive) {
return $keys === array_keys($keys);
}
foreach ($keys as $key) {
if (!is_int($key)) {
return false;
}
}
return true;
}
检查数组或 可遍历对象 是否为另一个数组或 可遍历对象 的子集。
如果 $needles
的所有元素都包含在 $haystack
中,则此方法将返回 true
。如果至少缺少一个元素,则返回 false
。
public static boolean isSubset ( $needles, $haystack, $strict = false ) | ||
$needles | 可迭代对象 |
必须全部位于 |
$haystack | 可迭代对象 |
要搜索的值集。 |
$strict | boolean |
是否启用严格 ( |
返回值 | boolean |
如果 |
---|---|---|
抛出 | yii\base\InvalidArgumentException |
如果 |
public static function isSubset($needles, $haystack, $strict = false)
{
if (!static::isTraversable($needles)) {
throw new InvalidArgumentException('Argument $needles must be an array or implement Traversable');
}
foreach ($needles as $needle) {
if (!static::isIn($needle, $haystack, $strict)) {
return false;
}
}
return true;
}
检查变量是否为数组或 可遍历对象。
此方法与 PHP 函数 is_array() 相同,但此外它还适用于实现了 Traversable 接口的对象。
public static boolean isTraversable ( $var ) | ||
$var | 混合 |
正在评估的变量。 |
返回值 | boolean |
是否可以通过 foreach 遍历 $var |
---|
public static function isTraversable($var)
{
return is_array($var) || $var instanceof Traversable;
}
检查给定数组是否包含指定的键。
此方法增强了 array_key_exists()
函数,支持不区分大小写的键比较。
public static boolean keyExists ( $key, $array, $caseSensitive = true ) | ||
$key | string|integer |
要检查的键 |
$array | array|ArrayAccess |
具有要检查键的数组 |
$caseSensitive | boolean |
键比较是否区分大小写 |
返回值 | boolean |
数组是否包含指定的键 |
---|
public static function keyExists($key, $array, $caseSensitive = true)
{
// ToDo: This check can be removed when the minimum PHP version is >= 8.1 (Yii2.2)
if (is_float($key)) {
$key = (int)$key;
}
if ($caseSensitive) {
if (is_array($array) && array_key_exists($key, $array)) {
return true;
}
// Cannot use `array_has_key` on Objects for PHP 7.4+, therefore we need to check using [[ArrayAccess::offsetExists()]]
return $array instanceof ArrayAccess && $array->offsetExists($key);
}
if ($array instanceof ArrayAccess) {
throw new InvalidArgumentException('Second parameter($array) cannot be ArrayAccess in case insensitive mode');
}
foreach (array_keys($array) as $k) {
if (strcasecmp($key, $k) === 0) {
return true;
}
}
return false;
}
从多维数组或对象数组构建映射(键值对)。
$from
和 $to
参数指定要设置映射的键名或属性名。可选地,可以使用一个分组字段 $group
来进一步对映射进行分组。
例如,
$array = [
['id' => '123', 'name' => 'aaa', 'class' => 'x'],
['id' => '124', 'name' => 'bbb', 'class' => 'x'],
['id' => '345', 'name' => 'ccc', 'class' => 'y'],
];
$result = ArrayHelper::map($array, 'id', 'name');
// the result is:
// [
// '123' => 'aaa',
// '124' => 'bbb',
// '345' => 'ccc',
// ]
$result = ArrayHelper::map($array, 'id', 'name', 'class');
// the result is:
// [
// 'x' => [
// '123' => 'aaa',
// '124' => 'bbb',
// ],
// 'y' => [
// '345' => 'ccc',
// ],
// ]
public static array map ( $array, $from, $to, $group = null ) | ||
$array | array | |
$from | string|Closure | |
$to | string|Closure | |
$group | string|Closure|null |
public static function map($array, $from, $to, $group = null)
{
$result = [];
foreach ($array as $element) {
$key = static::getValue($element, $from);
$value = static::getValue($element, $to);
if ($group !== null) {
$result[static::getValue($element, $group)][$key] = $value;
} else {
$result[$key] = $value;
}
}
return $result;
}
将两个或多个数组递归地合并为一个。
如果每个数组都有一个具有相同字符串键值的元素,则后者将覆盖前者(与 array_merge_recursive 不同)。如果两个数组都具有数组类型的元素并且具有相同的键,则将执行递归合并。对于整数键元素,来自后者的数组的元素将附加到前者的数组。可以使用 yii\helpers\UnsetArrayValue 对象从之前的数组中取消设置值,或者使用 yii\helpers\ReplaceArrayValue 强制替换之前的值而不是进行递归合并。
public static array merge ( $a, $b ) | ||
$a | array |
要合并到的数组 |
$b | array |
要从中合并的数组。您可以通过第三个参数、第四个参数等指定其他数组。 |
返回值 | array |
合并后的数组(原始数组不会改变)。 |
---|
public static function merge($a, $b)
{
$args = func_get_args();
$res = array_shift($args);
while (!empty($args)) {
foreach (array_shift($args) as $k => $v) {
if ($v instanceof UnsetArrayValue) {
unset($res[$k]);
} elseif ($v instanceof ReplaceArrayValue) {
$res[$k] = $v->value;
} elseif (is_int($k)) {
if (array_key_exists($k, $res)) {
$res[] = $v;
} else {
$res[$k] = $v;
}
} elseif (is_array($v) && isset($res[$k]) && is_array($res[$k])) {
$res[$k] = static::merge($res[$k], $v);
} else {
$res[$k] = $v;
}
}
}
return $res;
}
根据一个或多个键对对象或数组(具有相同结构)的数组进行排序。
public static void multisort ( &$array, $key, $direction = SORT_ASC, $sortFlag = SORT_REGULAR ) | ||
$array | array |
要排序的数组。调用此方法后,数组将被修改。 |
$key | string|Closure|array |
要排序的键。这指的是子数组元素的键名、对象的属性名或返回用于比较目的的值的匿名函数。匿名函数签名应为: |
$direction | integer|array |
排序方向。它可以是 |
$sortFlag | integer|array |
PHP 排序标志。有效值包括 |
抛出 | yii\base\InvalidArgumentException |
如果 $direction 或 $sortFlag 参数的元素数量与 $key 不一致。 |
---|
public static function multisort(&$array, $key, $direction = SORT_ASC, $sortFlag = SORT_REGULAR)
{
$keys = is_array($key) ? $key : [$key];
if (empty($keys) || empty($array)) {
return;
}
$n = count($keys);
if (is_scalar($direction)) {
$direction = array_fill(0, $n, $direction);
} elseif (count($direction) !== $n) {
throw new InvalidArgumentException('The length of $direction parameter must be the same as that of $keys.');
}
if (is_scalar($sortFlag)) {
$sortFlag = array_fill(0, $n, $sortFlag);
} elseif (count($sortFlag) !== $n) {
throw new InvalidArgumentException('The length of $sortFlag parameter must be the same as that of $keys.');
}
$args = [];
foreach ($keys as $i => $k) {
$flag = $sortFlag[$i];
$args[] = static::getColumn($array, $k);
$args[] = $direction[$i];
$args[] = $flag;
}
// This fix is used for cases when main sorting specified by columns has equal values
// Without it it will lead to Fatal Error: Nesting level too deep - recursive dependency?
$args[] = range(1, count($array));
$args[] = SORT_ASC;
$args[] = SORT_NUMERIC;
$args[] = &$array;
call_user_func_array('array_multisort', $args);
}
递归地排序数组。
public static array recursiveSort ( array &$array, $sorter = null ) | ||
$array | array |
按引用传递的数组。 |
$sorter | callable|null |
数组排序器。如果省略,则按值对索引数组进行排序,按键对关联数组进行排序。 |
public static function recursiveSort(array &$array, $sorter = null)
{
foreach ($array as &$value) {
if (is_array($value)) {
static::recursiveSort($value, $sorter);
}
}
unset($value);
if ($sorter === null) {
$sorter = static::isIndexed($array) ? 'sort' : 'ksort';
}
call_user_func_array($sorter, [&$array]);
return $array;
}
从数组中删除一项并返回该值。如果数组中不存在该键,则将返回默认值。
使用方法示例,
// $array = ['type' => 'A', 'options' => [1, 2]];
// working with array
$type = \yii\helpers\ArrayHelper::remove($array, 'type');
// $array content
// $array = ['options' => [1, 2]];
public static mixed|null remove ( &$array, $key, $default = null ) | ||
$array | array |
要从中提取值的数组 |
$key | string |
数组元素的键名 |
$default | 混合 |
如果指定键不存在,则返回的默认值 |
返回值 | mixed|null |
如果找到元素的值,否则为默认值 |
---|
public static function remove(&$array, $key, $default = null)
{
// ToDo: This check can be removed when the minimum PHP version is >= 8.1 (Yii2.2)
if (is_float($key)) {
$key = (int)$key;
}
if (is_array($array) && array_key_exists($key, $array)) {
$value = $array[$key];
unset($array[$key]);
return $value;
}
return $default;
}
从数组中删除具有匹配值的项,并返回已删除的项。
示例,
$array = ['Bob' => 'Dylan', 'Michael' => 'Jackson', 'Mick' => 'Jagger', 'Janet' => 'Jackson'];
$removed = \yii\helpers\ArrayHelper::removeValue($array, 'Jackson');
// result:
// $array = ['Bob' => 'Dylan', 'Mick' => 'Jagger'];
// $removed = ['Michael' => 'Jackson', 'Janet' => 'Jackson'];
public static array removeValue ( &$array, $value ) | ||
$array | array |
要在其中查找值的数组 |
$value | 混合 |
要从数组中删除的值 |
返回值 | array |
从数组中删除的项目 |
---|
public static function removeValue(&$array, $value)
{
$result = [];
if (is_array($array)) {
foreach ($array as $key => $val) {
if ($val === $value) {
$result[$key] = $val;
unset($array[$key]);
}
}
}
return $result;
}
在指定的键路径处将值写入关联数组。
如果还没有这样的键路径,它将被递归创建。如果键存在,它将被覆盖。
$array = [
'key' => [
'in' => [
'val1',
'key' => 'val'
]
]
];
ArrayHelper::setValue($array, 'key.in.0', ['arr' => 'val']);
的结果将是以下内容
[
'key' => [
'in' => [
['arr' => 'val'],
'key' => 'val'
]
]
]
ArrayHelper::setValue($array, 'key.in', ['arr' => 'val']);
或 ArrayHelper::setValue($array, ['key', 'in'], ['arr' => 'val']);
的结果将是以下内容
[
'key' => [
'in' => [
'arr' => 'val'
]
]
]
public static void setValue ( &$array, $path, $value ) | ||
$array | array |
要写入值的数组 |
$path | string|array|null |
要写入值的路径 |
$value | 混合 |
要写入的值 |
public static function setValue(&$array, $path, $value)
{
if ($path === null) {
$array = $value;
return;
}
$keys = is_array($path) ? $path : explode('.', $path);
while (count($keys) > 1) {
$key = array_shift($keys);
if (!isset($array[$key])) {
$array[$key] = [];
}
if (!is_array($array[$key])) {
$array[$key] = [$array[$key]];
}
$array = &$array[$key];
}
$array[array_shift($keys)] = $value;
}
将对象或对象数组转换为数组。
public static array toArray ( $object, $properties = [], $recursive = true ) | ||
$object | object|array|string |
要转换为数组的对象 |
$properties | array |
一个从对象类名到需要放入结果数组的属性的映射。为每个类指定的属性是一个以下格式的数组
|
$recursive | boolean |
是否递归地将作为对象的属性转换为数组。 |
返回值 | array |
对象的数组表示形式 |
---|
public static function toArray($object, $properties = [], $recursive = true)
{
if (is_array($object)) {
if ($recursive) {
foreach ($object as $key => $value) {
if (is_array($value) || is_object($value)) {
$object[$key] = static::toArray($value, $properties, true);
}
}
}
return $object;
} elseif ($object instanceof \DateTimeInterface) {
return (array)$object;
} elseif (is_object($object)) {
if (!empty($properties)) {
$className = get_class($object);
if (!empty($properties[$className])) {
$result = [];
foreach ($properties[$className] as $key => $name) {
if (is_int($key)) {
$result[$name] = $object->$name;
} else {
$result[$key] = static::getValue($object, $name);
}
}
return $recursive ? static::toArray($result, $properties) : $result;
}
}
if ($object instanceof Arrayable) {
$result = $object->toArray([], [], $recursive);
} else {
$result = [];
foreach ($object as $key => $value) {
$result[$key] = $value;
}
}
return $recursive ? static::toArray($result, $properties) : $result;
}
return [$object];
}
注册 或 登录 才能评论。