Update helper-array.md

This commit is contained in:
xhlstrive
2015-08-04 14:05:50 +08:00
parent 244ebde268
commit 83b04c24f4

View File

@ -1,12 +1,15 @@
数组助手类
===========
除了[PHP中丰富的数组函数集](http://php.net/manual/zh/book.array.php)Yii 数组助手类提供了额外的静态方法,让你更高效地处理数组。
除了[PHP中丰富的数组函数集](http://php.net/manual/zh/book.array.php)
Yii 数组助手类提供了额外的静态方法,让你更高效地处理数组。
## 获取值 <span id="getting-values"></span>
用原生PHP从一个对象、数组、或者包含这两者的一个复杂数据结构中获取数据是非常繁琐的。你首先得使用`isset` 检查key是否存在, 然后如果存在你就获取它,如果不存在,则提供一个默认返回值:
用原生PHP从一个对象、数组、或者包含这两者的一个复杂数据结构中获取数据是非常繁琐的。
你首先得使用`isset` 检查 key 是否存在, 然后如果存在你就获取它,如果不存在,
则提供一个默认返回值:
```php
class User
@ -29,7 +32,8 @@ Yii 提供了一个非常方便的方法来做这件事:
$value = ArrayHelper::getValue($array, 'foo.bar.name');
```
方法的第一个参数是我们从哪里获取值。第二个参数指定了如何获取数据,它可以是下述几种类型中的一个:
方法的第一个参数是我们从哪里获取值。第二个参数指定了如何获取数据,
它可以是下述几种类型中的一个:
- 数组键名或者欲从中取值的对象的属性名称;
- 以点号分割的数组键名或者对象属性名称组成的字符串,上例中使用的参数类型就是该类型;
@ -43,7 +47,7 @@ $fullName = ArrayHelper::getValue($user, function ($user, $defaultValue) {
});
```
第三个可选的参数如果没有给定值,则默认为`null` ,如下例所示:
第三个可选的参数如果没有给定值,则默认为 `null`,如下例所示
```php
$username = ArrayHelper::getValue($comment, 'user.username', 'Unknown');
@ -56,7 +60,8 @@ $array = ['type' => 'A', 'options' => [1, 2]];
$type = ArrayHelper::remove($array, 'type');
```
执行了上述代码之后, `$array` 将包含 `['options' => [1, 2]]` 并且 `$type` 将会是 `A`注意和 `getValue` 方法不同的是, `remove` 方法只支持简单键名。
执行了上述代码之后, `$array` 将包含 `['options' => [1, 2]]` 并且 `$type` 将会是 `A`
注意和 `getValue` 方法不同的是,`remove` 方法只支持简单键名。
## 检查键名的存在<span id="checking-existence-of-keys"></span>
@ -90,9 +95,10 @@ $data = [
$ids = ArrayHelper::getColumn($array, 'id');
```
结果将是 `['123', '345']`.
结果将是 `['123', '345']`
如果需要额外的转换或者取值的方法比较复杂,第二参数可以指定一个匿名函数:
如果需要额外的转换或者取值的方法比较复杂,
第二参数可以指定一个匿名函数:
```php
$result = ArrayHelper::getColumn($array, function ($element) {
@ -103,10 +109,11 @@ $result = ArrayHelper::getColumn($array, function ($element) {
## 重建数组索引 <span id="reindexing-arrays"></span>
按一个指定的键名重新索引一个数组,可以用 `index` 方法。输入的数组应该是多维数组或者是一个对象数组。键名(译者注:第二个参数)可以是子数组
的键名、对象的属性名,也可以是一个返回给定元素数组键值的匿名函数。
按一个指定的键名重新索引一个数组,可以用 `index` 方法。输入的数组应该是多维数组或者是一个对象数组。
键名(译者注:第二个参数)可以是子数组的键名、对象的属性名,
也可以是一个返回给定元素数组键值的匿名函数。
如果一个键值译者注第二个参数对应的值是null相应的数组元素将被丢弃并且不会放入到结果中例如
如果一个键值(译者注:第二个参数对应的值)是 null相应的数组元素将被丢弃并且不会放入到结果中例如
```php
$array = [
@ -129,8 +136,8 @@ $result = ArrayHelper::index($array, function ($element) {
## 建立哈希表 <span id="building-maps"></span>
为了从一个多维数组或者一个对象数组中建立一个映射表(键值对),你可以使用`map`方法.`$from``$to` 参数分别指定了欲构建的映射表的键名和属性名。
为了从一个多维数组或者一个对象数组中建立一个映射表(键值对),你可以使用
`map`方法.`$from``$to` 参数分别指定了欲构建的映射表的键名和属性名。
根据需要,你可以按照一个分组字段 `$group` 将映射表进行分组,例如。
```php
@ -185,7 +192,8 @@ ArrayHelper::multisort($data, ['age', 'name'], [SORT_ASC, SORT_DESC]);
];
```
第二个参数指定排序的键名,如果是单键名的话可以是字符串,如果是多键名则是一个数组,或者是如下例所示的一个匿名函数:
第二个参数指定排序的键名,如果是单键名的话可以是字符串,如果是多键名则是一个数组,
或者是如下例所示的一个匿名函数:
```php
ArrayHelper::multisort($data, function($item) {
@ -193,13 +201,16 @@ ArrayHelper::multisort($data, function($item) {
});
```
第三个参数表示增降顺序。单键排序时,它可以是`SORT_ASC`或者`SORT_DESC`之一。如果是按多个键名排序,你可以用一个数组为各个键指定不同的顺序。
第三个参数表示增降顺序。单键排序时,它可以是 `SORT_ASC` 或者 `SORT_DESC` 之一。
如果是按多个键名排序,你可以用一个数组为各个键指定不同的顺序。
最后一个参数译者注第四个参数是PHP的排序标识(sort flag)可使用的值和调用PHP
[sort()](http://php.net/manual/zh/function.sort.php) 函数时传递的值一样。
最后一个参数译者注第四个参数是PHP的排序标识(sort flag)可使用的值和调用PHP[sort()](http://php.net/manual/zh/function.sort.php) 函数时传递的值一样。
## 检测数组类型 <span id="detecting-array-types"></span>
想知道一个数组是索引数组还是联合数组很方便,这有个例子:
```php
@ -222,29 +233,34 @@ $encoded = ArrayHelper::htmlEncode($data);
$decoded = ArrayHelper::htmlDecode($data);
```
默认情况只会对值做编码(译者注:原文中是编码,应为编解码)。通过给第二个参数传 `false` ,你也可以对键名做编码。编码将默认使用应用程序的字符集,
你可以通过第三个参数指定该字符集。
默认情况只会对值做编码(译者注:原文中是编码,应为编解码)。通过给第二个参数传 `false` ,你也可以对键名做编码。
编码将默认使用应用程序的字符集,你可以通过第三个参数指定该字符集。
## 合并数组 <span id="merging-arrays"></span>
```php
/**
* 将两个或者多个数组递归式的合并为一个数组。
* 如果每个数组有一个元素的键名相同,那么后面元素的将覆盖前面的元素(不同于 array_merge_recursive
* 如果两个数组都有相同键名的数组元素(译者注:嵌套数组)则将引发递归合并
* 如果每个数组有一个元素的键名相同,
* 那么后面元素的将覆盖前面的元素(不同于 array_merge_recursive
* 如果两个数组都有相同键名的数组元素(译者注:嵌套数组)
* 则将引发递归合并。
* 对数值型键名的元素,后面数组中的这些元素会被追加到前面数组中。
* @param array $a 被合并的数组
* @param array $b 合并的数组,你可以在第三、第四个参数中指定另外的合并数组,等等
* @param array $b 合并的数组,你可以在第三、第四个
* 参数中指定另外的合并数组,等等
* @return 合并的结果数组 (原始数组不会被改变)
*/
public static function merge($a, $b)
```
## 对象转换为数组 <span id="converting-objects-to-arrays"></span>
你经常要将一个对象或者对象的数组转换成一个数组常见的情形是为了通过REST API提供数据数组或其他使用方式将AR模型(活动记录模型)转换成数组。如下代码可完成这个工作:
你经常要将一个对象或者对象的数组转换成一个数组常见的情形是为了通过REST API提供数据数组或其他使用方式
将AR模型(活动记录模型)转换成数组。如下代码可完成这个工作:
```php
$posts = Post::find()->limit(10)->all();
@ -262,10 +278,10 @@ $data = ArrayHelper::toArray($posts, [
]);
```
第一个参数包含我们想要转换的数据,在本例中,我们要转换一个叫 `Post` 的 AR 模型.
第一个参数包含我们想要转换的数据,在本例中,我们要转换一个叫 `Post` 的 AR 模型
第二个参数是每个类的转换映射表,我们在此设置了一个`Post` 模型的映射.
每个映射数组包含一组的映射,每个映射可以是:
第二个参数是每个类的转换映射表,我们在此设置了一个`Post` 模型的映射
每个映射数组包含一组的映射,每个映射可以是
- 一个要包含的照原样的字段名(和类中属性的名称一致);
- 一个由你可随意取名的键名和你想从中取值的模型列名组成的键值对;
@ -273,6 +289,7 @@ $data = ArrayHelper::toArray($posts, [
这上面的转换结果将会是:
```php
[
'id' => 123,
@ -281,4 +298,6 @@ $data = ArrayHelper::toArray($posts, [
'length' => 301,
]
```
也可以在一个特定的类中实现[[yii\base\Arrayable|Arrayable]]接口,从而为其对象提供默认的转换成数组的方法。
也可以在一个特定的类中实现[[yii\base\Arrayable|Arrayable]]接口,
从而为其对象提供默认的转换成数组的方法。