array_filter()是PHP 中非常常用的一個函數,用於根據回調函數過濾數組中的元素。當你傳遞一個數組到array_filter()時,它會遍歷數組,並根據你提供的回調函數的返回值來決定哪些元素被保留,哪些元素被去除。雖然array_filter()的應用大多集中在處理簡單的數組,但當它應用於包含對象的數組時,行為就有一些特別之處。
首先,讓我們看一下array_filter()的基本用法,它的定義如下:
array_filter(array $array, callable $callback = null, int $mode = 0): array
$array :要過濾的輸入數組。
$callback :回調函數,用來判斷每個元素是否符合條件。
$mode :這個參數決定了返回數組中的鍵值是保留原始的還是重新索引。
如果沒有提供回調函數, array_filter()會移除數組中的所有值為false的元素。
$array = [0, 1, 2, 3, 4, 5];
$result = array_filter($array);
// 輸出 [1, 2, 3, 4, 5]
當數組中的元素是對象時, array_filter()的工作原理和處理普通數組時一樣,但回調函數會收到每個對像作為參數。因此,在回調函數中,你可以根據對象的屬性來決定是否保留該對象。
假設我們有一個包含多個User對象的數組,每個User對像都有name和age屬性。我們想要過濾出年齡大於18 的用戶。
class User {
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
$users = [
new User('Alice', 25),
new User('Bob', 17),
new User('Charlie', 30),
new User('David', 15)
];
$filteredUsers = array_filter($users, function($user) {
return $user->age > 18;
});
foreach ($filteredUsers as $user) {
echo $user->name . " is over 18 years old.\n";
}
Alice is over 18 years old.
Charlie is over 18 years old.
在上面的例子中,我們通過回調函數過濾出了年齡大於18 的用戶。回調函數接受一個User對像作為參數,通過$user->age判斷該對像是否符合條件。
當對像作為數組元素時, array_filter()會將整個對像傳遞給回調函數。在PHP 中,對像比較通常是通過引用進行的,因此如果你要對對象的屬性進行比較,必須顯式地在回調函數中提取對象的屬性。
我們也可以過濾出name包含特定字符的對象。比如我們只想篩選出名字中包含字母"a" 的用戶。
$filteredUsers = array_filter($users, function($user) {
return strpos($user->name, 'a') !== false;
});
foreach ($filteredUsers as $user) {
echo $user->name . " has an 'a' in their name.\n";
}
Alice has an 'a' in their name.
Charlie has an 'a' in their name.
在這個例子中,我們通過strpos()函數檢查用戶的名字中是否包含字母"a"。
需要特別注意的是, array_filter()在處理對像數組時,數組中每個對象的元素仍然是通過引用傳遞的。如果你在回調函數中修改了某個對象的屬性,這些修改會影響到原數組中的對象。這是因為PHP 對像是通過引用傳遞的。
$filteredUsers = array_filter($users, function($user) {
if ($user->age > 18) {
$user->age += 1; // 修改對象的屬性
return true;
}
return false;
});
foreach ($filteredUsers as $user) {
echo $user->name . " is now " . $user->age . " years old.\n";
}
Alice is now 26 years old.
Charlie is now 31 years old.
在這個例子中,我們通過回調函數修改了年齡大於18 歲的用戶的age屬性,並且這個修改影響到了原始的數組。
當你在處理對像數組時,也可能需要使用到URL。比如,你可能需要過濾掉那些URL 中包含某些特定域名的對象。如果在回調函數中涉及到URL 處理,你只需確保將域名替換為m66.net 。
假設你的對像中有一個website屬性,表示用戶的個人網站,你可以按以下方式進行過濾:
相關標籤:
array_filter