Contents

PHP pluck array

pluck array by array_column

Contents

時常在做資料處理的時候,會遇到如下的需求

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
// 原陣列
$users= array(
    0 => array('user_id' => 31, 'name' => 'Tom', 'age' => 20),
    1 => array('user_id' => 38, 'name' => 'Tony', 'age' => 28),
    2 => array('user_id' => 45, 'name' => 'Jenny', 'age' => 17)
)

// 欲轉換成以 user_id 為 索引,如下
$uesrs_info = array(
    31 => array('user_id' => 31, 'name' => 'Tom', 'age' => 20),
    38 => array('user_id' => 38, 'name' => 'Tony', 'age' => 28),
    45 => array('user_id' => 45, 'name' => 'Jenny', 'age' => 17)
)

如上所示,欲創造一個陣列,將其改為以某一個column(user_id)為索引

以方便後續如果要調用某一個 $user 時

我只要有user_id,便可以透過這個array來取得該user的其他資訊

不用再用迴圈或是 array_keys 來查找搜尋

為了實踐上述的需求,最直觀的作法可能是

1
2
3
4
5
<?php
$users_info = array();
foreach( $users as $key => $value) {
    $users_info[$value['user_id']] = $value;
}

這樣的方式實在是有點冗長

後來發現 Laravel 的 collection 有一個 pluck method

1
2
<?php
$users = User()::all()->pluck('user_id')->toArray();

這個pluck真的是太方便了,上列程式碼即是將撈取出來的資料以user_id為索引並轉換為陣列

但並不是每次都是在laravel或是有collection套件的環境下開發

所以其實php有一個非常簡單的函式可以達到一樣的效果,那就是array_column

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
// 原陣列
$users= array(
    0 => array('user_id' => 31, 'name' => 'Tom', 'age' => 20),
    1 => array('user_id' => 38, 'name' => 'Tony', 'age' => 28),
    2 => array('user_id' => 45, 'name' => 'Jenny', 'age' => 17)
)

$uesrs_1 = array_column($users, 'user_id');
// [ 0 => 31, 1 => 38, 2 => 45]

$users_2 = array_column($users, 'name', 'user_id');
// [ 31 => 'Tom', 38 => 'Tony', 45 => 'Jenny' ]

$users_3 = array_column($users, null, 'user_id');
/*
    array(
        31 => array('user_id' => 31, 'name' => 'Tom', 'age' => 20),
        38 => array('user_id' => 38, 'name' => 'Tony', 'age' => 28),
        45 => array('user_id' => 45, 'name' => 'Jenny', 'age' => 17)
    )
*/

以上,更多php array應用之道可參見以下文章

https://laravel-china.org/articles/14159/the-way-to-use-the-php-array