当前位置: 首页> 最新文章列表> 如何在 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 的数组排序更加高效和灵活。