陣列函式系列的最後一天!
當只傳第一個參數的時候,
這個函式會濾掉你的陣列中等於 FALSE 的值!
<?php
$mudaMudaMuda = [
NULL,
FALSE,
0,
'',
[],
];
print_r(array_filter($mudaMudaMuda));
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
都是得到 value(並拿來過濾)。
但當你傳入下列其中一個值的時候,callback
獲得的資料也會相應改變:
ARRAY_FILTER_USE_KEY
(key)ARRAY_FILTER_USE_BOTH
(key、value)底下舉例使用 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);
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));
這個函式可以幫你比較在傳入的第一個陣列之中,
它的哪些值是第二、第三、第四...個陣列都不曾出現過的~
範例就請你們直接修改上一篇範例的最後一行,(偷懶 XD)
就能得到有哪些 $man 的特質是 $woman 身上沒有的了~