在PHP 中, usort()是一個非常有用的函數,它允許我們對數組進行自定義排序。 usort()函數的第二個參數是一個回調函數(通常是比較函數),這個函數決定瞭如何對數組中的元素進行排序。為了更靈活地控制排序規則,我們通常會使用匿名函數作為回調函數。
usort()函數用於對數組進行排序,並允許用戶自定義排序規則。其基本語法如下:
<span><span><span class="hljs-title function_ invoke__">usort</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> &</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。
在許多情況下,我們並不希望為每個排序操作單獨定義一個函數。 PHP 允許我們使用匿名函數(也叫閉包)來簡化這一過程。匿名函數可以直接作為usort()的回調函數,而無需單獨聲明一個命名函數。
<span><span><span class="hljs-meta"><?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">?></span></span><span>
</span></span>
輸出:
<span><span>Array
(
[</span><span><span class="hljs-meta">0</span></span><span>] => </span><span><span class="hljs-number">1</span></span><span>
[</span><span><span class="hljs-meta">1</span></span><span>] => </span><span><span class="hljs-number">2</span></span><span>
[</span><span><span class="hljs-meta">2</span></span><span>] => </span><span><span class="hljs-number">5</span></span><span>
[</span><span><span class="hljs-meta">3</span></span><span>] => </span><span><span class="hljs-number">5</span></span><span>
[</span><span><span class="hljs-meta">4</span></span><span>] => </span><span><span class="hljs-number">6</span></span><span>
[</span><span><span class="hljs-meta">5</span></span><span>] => </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"><?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">?></span></span><span>
</span></span>
輸出:
<span><span>Array
(
[</span><span><span class="hljs-meta">0</span></span><span>] => date
[</span><span><span class="hljs-meta">1</span></span><span>] => apple
[</span><span><span class="hljs-meta">2</span></span><span>] => banana
[</span><span><span class="hljs-meta">3</span></span><span>] => cherry
)
</span></span>
在這個例子中, strlen($a) - strlen($b)用來根據字符串的長度進行排序。
假設我們有一個包含多個對象的數組,並且希望按對象的某個屬性進行排序:
<span><span><span class="hljs-meta"><?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>->name = </span><span><span class="hljs-variable">$name</span></span><span>;
</span><span><span class="hljs-variable language_">$this</span></span><span>->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>->age - </span><span><span class="hljs-variable">$b</span></span><span>->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>->name . </span><span><span class="hljs-string">" ("</span></span><span> . </span><span><span class="hljs-variable">$person</span></span><span>->age . </span><span><span class="hljs-string">")\n"</span></span><span>;
}
</span><span><span class="hljs-meta">?></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>
這個例子展示瞭如何使用匿名函數根據對象的屬性進行排序。
在PHP 中, usort()函數是一個非常靈活的工具,通過使用匿名函數,我們可以快速實現複雜的自定義排序邏輯。匿名函數作為回調函數的優勢在於,它不需要額外的命名函數,可以直接在調用usort()時定義排序規則,代碼更加簡潔和易於維護。
通過合理運用匿名函數,開發者可以實現從簡單到復雜的各種排序需求,使得PHP 的數組排序更加高效和靈活。