在PHP中内置的对数组操作的方法(函数)有一个叫做’array_column’的非常实用,它可以用作返回一个二维数组的指定列。

  先介绍一下它!

  好比这样一个用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$students = array(
array(
'id'=>1,
'name'=>'Jerry'
),
array(
'id'=>3,
'name'=>'Tom'
),
array(
'id'=>6,
'name'=>'Lily'
),
array(
'id'=>11,
'name'=>'Bob'
),
);
$student_names = array_column($students,'name');
var_dump($student_names);

输出结果:

1
2
3
4
5
array (size=4)
0 => string 'Jerry' (length=5)
1 => string 'Tom' (length=3)
2 => string 'Lily' (length=4)
3 => string 'Bob' (length=3)

  这样就得到了一个所有名字的数组,想必对于一个PHPER来说并不陌生。但是今天要讲的重点是array_column的另外一个用法,如果给它第三个参数,那么它将以第三个参数对应的数组中的值作为返回数组的键,用例如下:

1
2
$studentID_name = array_column($students,'name','id');
var_dump($studentID_name);

  输出结果:

1
2
3
4
5
array (size=4)
1 => string 'Jerry' (length=5)
3 => string 'Tom' (length=3)
6 => string 'Lily' (length=4)
11 => string 'Bob' (length=3)

  利用这样的数组,你可以直接使用id去访问此id对应的名字,$studentID_name[3] as Tom

  如果student不仅仅包含id和name,假如还有其他如age,sex字段,你还想同时通过id得到这个’对象’的其他字段值,你不必定义多个类似$studentID_age/$studentID_sex的变量,只需要将array_column的第二个参数设置成NULL即可,如下:

1
2
$studentID_student = array_column($students,NULL,'id');
var_dump($studentID_student);

  输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
array (size=4)
1 =>
array (size=2)
'id' => int 1
'name' => string 'Jerry' (length=5)
3 =>
array (size=2)
'id' => int 3
'name' => string 'Tom' (length=3)
6 =>
array (size=2)
'id' => int 6
'name' => string 'Lily' (length=4)
11 =>
array (size=2)
'id' => int 11
'name' => string 'Bob' (length=3)

  它的介绍到这里就算完了,那么问题在哪里呢?

  在于第三个参数!! 第三个参数指定的值必须是整型或字符串型,如果是其它类型(如浮点型等),则不会如你所愿,即使float(10)和int(10)看着没啥区别?

  上栗子!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$students = array(
array(
'id'=>1,
'name'=>'Jerry'
),
array(
'id'=>floatval(3),
'name'=>'Tom'
),
array(
'id'=>6,
'name'=>'Lily'
),
array(
'id'=>11,
'name'=>'Bob'
),
array(
'id'=>floatval(30),
'name'=>'Sam'
),
);
$studentID_student = array_column($students,NULL,'id');
var_dump($studentID_student);

  上面的栗子中,我将第二个数据的id换成了浮点型3,然后最后新增了一个数据,id为浮点型30。

  理想中的结果应该是在上面介绍的结果中多了一个索引为30的Sam,嗯!我也是这样想的,但结果总是那么的’相似‘。

  看结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
array (size=5)
1 =>
array (size=2)
'id' => int 1
'name' => string 'Jerry' (length=5)
2 =>
array (size=2)
'id' => float 3
'name' => string 'Tom' (length=3)
6 =>
array (size=2)
'id' => int 6
'name' => string 'Lily' (length=4)
11 =>
array (size=2)
'id' => int 11
'name' => string 'Bob' (length=3)
12 =>
array (size=2)
'id' => float 30
'name' => string 'Sam' (length=3)

  从结果中来看,数量的确是5个了,但是索引不是我想要的呀喂!! 原因就在于id不为intstring类型的时候,该条数据在新数组的索引会被赋值为当前最大索引加1,第二条数据id=float(3),当前最大索引为1,那么它被设置键为1+1=2,最后新加的那条id为float(30)的Sam,在它之前的索引最大是11,那么它就应当为11+1=12了。

  其实,一般情况下,我们不会遇到像float这样的类型作为ID,自己写的自然是Int型,从数据库读取的默认是String型。然鹅~我是读Excel获得的数据,它给了我float类型,在这样的弱类型语言里面,不仔细琢磨还真不容易发现会有这样的Bug存在!!! PHP真的是最好的语言,也最容易犯错!!

  所以说,尽管它是弱类型语言,今后还是尽量自我约束,拿强类型规则来约束自己!