假装我不知道我在做什么,我不知道。你能解释一下需要回调的数组排序和比较函数是如何工作的吗?
以uasort()
函数为例。我应该如何设计一个回调函数来处理这个?当我尝试对数据进行排序时,“-1”、“+1”和“0”是什么意思?它会扫描所有数组元素吗?还是比这更有效?如果我希望“w”在“b”之前,而“a”在“x”之前怎么办?您可以在这个看似简单的领域提供的任何建议将不胜感激。
我会试一试!
例如,让我们看一个名称列表。你和我都知道如何按字母顺序对姓名列表进行排序,并且做了一百亿次。同样的事情也适用于数字。计算机需要能够对排序可能不那么直观的数据进行排序。
用于排序数组的回调函数涉及允许数组包含任意类型的数据的想法,回调提供“规则”来说明该数组中的任何两个项目如何相互关联。这样,排序算法可以获取该数据数组,重复调用“回调”函数以确定哪些元素属于哪个顺序,并返回排序后的列表。这就是回调的本质。
如果你想要一个字面上的类比,假设你把一个数据列表交给一个朋友,他们只知道一种排序方法,但不知道你列表中的项目是如何关联的。他们“回电”给你,问“这两个元素中的哪一个先出现?” 而你,知道数据和规则,拿起物品,应用你的规则,然后告诉朋友答案。最终,在多次重复此过程后,您的数据将返回给您排序。
这样,返回 -1、0 或 1 的“回调”返回的值表示,当用两条数据调用时,-1 表示“项目一在项目二之前”,0 表示“项目一等于项目2”,+1 表示“第 1 项在第 2 项之后”。您只需提供根据数据规则确定返回哪个值的比较。您可以定义任意数据集,并在您的问题“空间”中定义您希望的任何优先规则。顺便说一句,这是面向对象编程的重要组成部分——我可以利用这种“回调”思想来实现复杂排序算法的通用版本,而永远不知道或关心那种类型正在排序的数据——所有这些都是因为使用这种“固定”排序机制的程序员将提供排序例程所需的“逻辑管道”。
我认为这是一个很好的解释,而且也是一种与语言无关的方式!:) 希望有帮助。
编辑。让我举个例子:
List:
Item # Value
1 12
2 15
3 9
4 26
5 4
如果我开始寻找列表中最小的项目,我将从项目 1 开始,并将其与列表中的每个剩余项目进行比较。所以,首先,我将第 1 项与第 2 项进行比较:
compare(item(1),item(2))
这将返回 -1,因为 12 的值在 15之前。现在,我转到列表中的下一项:
compare(item(1),item(3))
这次返回 1,因为 12跟在9 后面,这意味着 item(3) 现在是迄今为止找到的最小的项目。现在,我们这样比较:
compare(item(3),item(4))
在这种情况下,比较返回 -1,因为 9 在 26 之前,导致我们进入最终比较:
compare(item(3),item(5))
这个调用将返回 +1,因为 9 在 4 之后。当我们用尽列表中的所有项目时,我们知道 item(3) 是最小的项目。然后我们将该项目交换为“先前”的顶部项目,并从项目(2)开始重复整个过程。这是一个臭名昭著的低效“冒泡排序”的示例,但用于本说明的目的。这就是“第一项”和“第二项”引用的来源。排序,无论语言如何,就像计算机科学中的任何其他问题一样,归结为将大问题分解成小块,排序归结为重复比较较大列表中的两个项目。
首先,阅读手册。摘要页面是查看指定种类的好地方。要回答您的一些问题:
当然,排序会扫描所有数组元素。它怎么知道最后一个元素可能放在哪里?但这并不重要。您无需了解使用了哪种排序算法。您只需要提供一个知道如何比较数组中任意两项的函数,而不考虑其他任何项。
排序算法发挥了它的魔力,只要它想知道哪个元素“在”另一个之前就调用你的函数。它使用两个项目调用您的函数,每个项目作为参数。
您的函数返回:
您可以编写一个方法来进行任何类型的排序。如果你想让'w'出现在'b'之前,那么如果第一个参数以'w'开头并且第二个参数以'b'开头,你会想要返回-1。一个例子太人为了,我懒得写一个示例函数。
但是在你学习如何编写回调之前,你首先需要有一个排序的理由,这样你就有一个要完成的目标。
运行此示例以查看排序函数调用您的回调的次数:
<?php
function mysort($a, $b)
{
echo "$a vs $b\n";
return $a - $b;
}
// randomly create an array with 1 to 20 as elements
$data = range(1,20);
shuffle($data);
// before
print_r($data);
// sort
usort($data, 'mysort');
// after
print_r($data);
它使用排序算法系统地对数组进行排序,方法是使用您的函数告诉它有关如何订购两个单独项目的信息。