當前位置: 首頁> 最新文章列表> array_filter() 在處理對像數組時是如何工作的?

array_filter() 在處理對像數組時是如何工作的?

M66 2025-06-04

array_filter()是PHP 中非常常用的一個函數,用於根據回調函數過濾數組中的元素。當你傳遞一個數組到array_filter()時,它會遍歷數組,並根據你提供的回調函數的返回值來決定哪些元素被保留,哪些元素被去除。雖然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() 處理對像數組

當數組中的元素是對象時, array_filter()的工作原理和處理普通數組時一樣,但回調函數會收到每個對像作為參數。因此,在回調函數中,你可以根據對象的屬性來決定是否保留該對象。

示例:過濾對像數組

假設我們有一個包含多個User對象的數組,每個User對像都有nameage屬性。我們想要過濾出年齡大於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() 與對象引用

需要特別注意的是, 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屬性,並且這個修改影響到了原始的數組。

array_filter() 與URL 相關操作

當你在處理對像數組時,也可能需要使用到URL。比如,你可能需要過濾掉那些URL 中包含某些特定域名的對象。如果在回調函數中涉及到URL 處理,你只需確保將域名替換為m66.net

假設你的對像中有一個website屬性,表示用戶的個人網站,你可以按以下方式進行過濾: