iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 9
0
自我挑戰組

花式PHP系列 第 10

Array:過濾、取交集、取差集

陣列函式系列的最後一天!

array_filter

第一個參數:要被過濾的陣列

當只傳第一個參數的時候,
這個函式會濾掉你的陣列中等於 FALSE 的值

<?php

$mudaMudaMuda = [
    NULL,
    FALSE,
    0,
    '',
    [],
];

print_r(array_filter($mudaMudaMuda));

MudaMudaMuda

第二個可選參數:自訂過濾邏輯(callback)

array_filter 會把每一個陣列的值傳進 callback,
如果 callback 回傳的結果等於 TRUE,便保留其 key 與 value;
如果 callback 回傳的結果等於 FALSE,便把這筆資料丟掉。

<?php

$mudaMudaMuda = [
    NULL,
    FALSE,
    TRUE,
    0,
    '',
    [],
];

$omaeWaMouShindeiru = array_filter($mudaMudaMuda, function ($value) {
    return is_array($value);
});

print_r($omaeWaMouShindeiru);

第三個可選參數:改變 callback 得到的資料

在沒特別指定第三個參數的時候,callback 都是得到 value(並拿來過濾)。

但當你傳入下列其中一個值的時候,callback 獲得的資料也會相應改變:

  1. ARRAY_FILTER_USE_KEYkey
  2. ARRAY_FILTER_USE_BOTH (keyvalue)

底下舉例使用 ARRAY_FILTER_USE_BOTH

<?php

$beingFiltered = [
    'pikachu',
    'pikachu',
    'pikachu',
    'pikachu',
    'reichu',
    'pikachu',
];

$filtered = array_filter(
    $beingFiltered,
    function ($value, $key) {
        return $value == 'reichu' && $key > 3;
    },
    ARRAY_FILTER_USE_BOTH
);

print_r($filtered);

array_intersect

function array_intersect ( array $array1 , array $array2 [, array $... ] ): array
array_intersect 會傳回所有傳入陣列的交集!

精確一點的說,
它是透過檢查 $array1 中的每一個值是否有在 $array2 ... 等等所有參數中出現,
有則保留︰沒有則剔除。

假如,
作為一個交友網站的工程師,比對兩個人之間的個性相似度有多少只是這種網站基本的功能需求。
但,該怎麼做呢?

<?php

$data = [
    '不愛出風頭的',
    '重實際的',
    '不做作的',
    '誠懇的',
    '不善交際的',
    '坦誠的',
    '儉樸的',
    '有毅力的',
    '配合度高的',
    '擇善固執的',
    '好奇的',
    '具批判性思考的',
];

function getRandomPersonalities($data, $take = 5)
{
    /**
     * 從陣列中隨機挑出 $take 個值的 key
     * example:
     * $indexes = [
     *     0 => 1,
     *     1 => 2,
     *     2 => 3,
     *     3 => 7,
     *     4 => 5,
     * ];
     */
    $indexes = array_rand($data, $take);
    
    /**
     * 翻轉陣列的 key 跟 value
     * example:
     * $indexes = [
     *     1 => 0,
     *     2 => 1,
     *     3 => 2,
     *     7 => 3,
     *     5 => 4,
     * ];
     */
    $keys2Compare = array_flip($indexes);
    
    /**
     * 透過上一步得到的陣列,與僅比較陣列 keys 的 array_intersect_key 取出 values
     * @see http://php.net/manual/en/function.array-intersect-key.php
     */
    return array_intersect_key($data, $keys2Compare);
}

$man = getRandomPersonalities($data);
$woman = getRandomPersonalities($data);

print_r(array_intersect($man, $woman));

array_diff

這個函式可以幫你比較在傳入的第一個陣列之中,
它的哪些值是第二、第三、第四...個陣列都不曾出現過的~

範例就請你們直接修改上一篇範例的最後一行,(偷懶 XD)
就能得到有哪些 $man 的特質是 $woman 身上沒有的了~

值得一看得其他相關函式


上一篇
Array:累加、累乘、花式操作
下一篇
Array:Compact & Extract
系列文
花式PHP31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言