當前位置: 首頁> 最新文章列表> 如何在PHP 的usort 函數中使用匿名函數作為自定義比較器?

如何在PHP 的usort 函數中使用匿名函數作為自定義比較器?

gitbox 2025-08-28

如何在PHP 的usort 函數中使用匿名函數作為自定義比較器?

在PHP 中, usort()是一個非常有用的函數,它允許我們對數組進行自定義排序。 usort()函數的第二個參數是一個回調函數(通常是比較函數),這個函數決定瞭如何對數組中的元素進行排序。為了更靈活地控制排序規則,我們通常會使用匿名函數作為回調函數。

1. usort()函數簡介

usort()函數用於對數組進行排序,並允許用戶自定義排序規則。其基本語法如下:

 <span><span><span class="hljs-title function_ invoke__">usort</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> &amp;</span><span><span class="hljs-variable">$array</span></span><span>, </span><span><span class="hljs-keyword">callable</span></span><span> </span><span><span class="hljs-variable">$callback</span></span><span>);
</span></span>
  • $array是要排序的數組。

  • $callback是一個回調函數,接收兩個數組元素作為參數,並返回一個值來決定它們的順序。回調函數應遵循如下規則:

    • 如果第一個元素小於第二個元素,返回負數。

    • 如果第一個元素大於第二個元素,返回正數。

    • 如果兩個元素相等,返回0。

2. 匿名函數作為自定義比較器

在許多情況下,我們並不希望為每個排序操作單獨定義一個函數。 PHP 允許我們使用匿名函數(也叫閉包)來簡化這一過程。匿名函數可以直接作為usort()的回調函數,而無需單獨聲明一個命名函數。

示例:使用匿名函數按數字從小到大排序

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-number">5</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">9</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>, </span><span><span class="hljs-number">6</span></span><span>];

</span><span><span class="hljs-comment">// 使用匿名函數進行排序</span></span><span>
</span><span><span class="hljs-title function_ invoke__">usort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$a</span></span><span> - </span><span><span class="hljs-variable">$b</span></span><span>;  </span><span><span class="hljs-comment">// 升序排列</span></span><span>
});

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

輸出:

 <span><span>Array
(
    [</span><span><span class="hljs-meta">0</span></span><span>] =&gt; </span><span><span class="hljs-number">1</span></span><span>
    [</span><span><span class="hljs-meta">1</span></span><span>] =&gt; </span><span><span class="hljs-number">2</span></span><span>
    [</span><span><span class="hljs-meta">2</span></span><span>] =&gt; </span><span><span class="hljs-number">5</span></span><span>
    [</span><span><span class="hljs-meta">3</span></span><span>] =&gt; </span><span><span class="hljs-number">5</span></span><span>
    [</span><span><span class="hljs-meta">4</span></span><span>] =&gt; </span><span><span class="hljs-number">6</span></span><span>
    [</span><span><span class="hljs-meta">5</span></span><span>] =&gt; </span><span><span class="hljs-number">9</span></span><span>
)
</span></span>

在這個例子中,匿名函數的參數$a$b是數組中的兩個元素, $a - $b表示我們希望按升序排列。如果你想按降序排列,只需要把return $a - $b;改為return $b - $a;

示例:按字符串長度排序

假設我們有一個字符串數組,並希望按字符串的長度進行排序:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">"apple"</span></span><span>, </span><span><span class="hljs-string">"banana"</span></span><span>, </span><span><span class="hljs-string">"cherry"</span></span><span>, </span><span><span class="hljs-string">"date"</span></span><span>];

</span><span><span class="hljs-comment">// 按字符串長度進行排序</span></span><span>
</span><span><span class="hljs-title function_ invoke__">usort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>) - </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$b</span></span><span>);  </span><span><span class="hljs-comment">// 根據長度升序排列</span></span><span>
});

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

輸出:

 <span><span>Array
(
    [</span><span><span class="hljs-meta">0</span></span><span>] =&gt; date
    [</span><span><span class="hljs-meta">1</span></span><span>] =&gt; apple
    [</span><span><span class="hljs-meta">2</span></span><span>] =&gt; banana
    [</span><span><span class="hljs-meta">3</span></span><span>] =&gt; cherry
)
</span></span>

在這個例子中, strlen($a) - strlen($b)用來根據字符串的長度進行排序。

示例:按自定義規則排序對象

假設我們有一個包含多個對象的數組,並且希望按對象的某個屬性進行排序:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">Person</span></span><span> {
    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-variable">$name</span></span><span>;
    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-variable">$age</span></span><span>;

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">__construct</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$name</span></span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>) {
        </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;name = </span><span><span class="hljs-variable">$name</span></span><span>;
        </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;age = </span><span><span class="hljs-variable">$age</span></span><span>;
    }
}

</span><span><span class="hljs-variable">$people</span></span><span> = [
    </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">Person</span></span><span>(</span><span><span class="hljs-string">"Alice"</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>),
    </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">Person</span></span><span>(</span><span><span class="hljs-string">"Bob"</span></span><span>, </span><span><span class="hljs-number">25</span></span><span>),
    </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">Person</span></span><span>(</span><span><span class="hljs-string">"Charlie"</span></span><span>, </span><span><span class="hljs-number">35</span></span><span>),
];

</span><span><span class="hljs-comment">// 按年齡升序排列</span></span><span>
</span><span><span class="hljs-title function_ invoke__">usort</span></span><span>(</span><span><span class="hljs-variable">$people</span></span><span>, function(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$a</span></span><span>-&gt;age - </span><span><span class="hljs-variable">$b</span></span><span>-&gt;age;
});

</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$people</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$person</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$person</span></span><span>-&gt;name . </span><span><span class="hljs-string">" ("</span></span><span> . </span><span><span class="hljs-variable">$person</span></span><span>-&gt;age . </span><span><span class="hljs-string">")\n"</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

輸出:

 <span><span>Bob (</span><span><span class="hljs-number">25</span></span><span>)
Alice (</span><span><span class="hljs-number">30</span></span><span>)
Charlie (</span><span><span class="hljs-number">35</span></span><span>)
</span></span>

這個例子展示瞭如何使用匿名函數根據對象的屬性進行排序。

3. 總結

在PHP 中, usort()函數是一個非常靈活的工具,通過使用匿名函數,我們可以快速實現複雜的自定義排序邏輯。匿名函數作為回調函數的優勢在於,它不需要額外的命名函數,可以直接在調用usort()時定義排序規則,代碼更加簡潔和易於維護。

通過合理運用匿名函數,開發者可以實現從簡單到復雜的各種排序需求,使得PHP 的數組排序更加高效和靈活。