使用用户定义的函数了解数组排序或比较函数回调

时间:2012-08-31 03:05:34

标签: php arrays

假装我不知道我在做什么,我不知道。你能解释一下需要回调的数组排序和比较函数是如何工作的吗?

uasort()函数为例。我该如何设计一个回调函数来处理这个问题?当我尝试对数据进行排序时,“-1”,“+ 1”和“0”的含义是什么?它会扫描所有数组元素吗?或者它比那更有效?如果我希望“w”在“b”之前出现,而“a”在“x”之前出现怎么办?您可以在这个看似简单的区域提出任何建议。

2 个答案:

答案 0 :(得分:1)

我会试一试!

举个例子,我们来看一个名单。你和我都知道如何按字母顺序对名单进行排序,并完成了数百次。同样的事情也适用于数字。计算机需要能够对排序可能不那么直观的数据进行排序。

用于排序数组的回调函数涉及允许数组包含任意类型数据的想法,回调提供“规则”以说明该数组中的任何两个项如何相互关联。通过这种方式,排序算法可以获取该数据数组,重复调用“回调”函数以确定哪些元素属于哪个顺序,并返回排序列表。这就是回调的本质。

如果你想要一个文字比喻,假装你把一个数据列表交给朋友,他们只知道方法进行排序,但不知道列表中的项目是如何相关的。他们“回电”给你,询问“这两个元素中的哪一个首先出现?”而且,您知道数据和规则,拿走项目,应用您的规则,然后告诉朋友答案。最终,在多次重复此过程后,您的数据将返回给您排序。

这样,返回-1,0或1的“回调”返回一个值,当用两条数据调用时,-1表示“第一项在第二项之前”,0表示“项目”一个等于第二项,“和+1说”第一项跟在第二项之后。“您只需提供比较,以确定根据数据规则返回的值。您可以定义任意数据集,并在问题“空间”中定义您希望的任何优先级规则。顺便说一句,这是面向对象编程的一个重要部分 - 我可以利用这个“回调”的想法来实现复杂排序算法的泛型版本,永远不会知道或关心关于正在排序的数据的 - 所有这些都是因为程序员使用这种“预制”排序机制将提供排序例程所需的“逻辑管道”。

我认为这是一个很好的解释,并且所有这些都是与语言无关的方式! :)希望有所帮助。

编辑。让我举个例子:

List:

Item #  Value
1        12
2        15
3         9
4        26
5         4

如果我开始寻找列表中的最小项目,我将从第1项开始,并将其与列表中的每个剩余项目进行比较。所以,第一遍,我将第1项与第2项进行比较:

compare(item(1),item(2))

将返回-1,因为12 的值在 15之前。现在,我转到列表中的 next 项目:

compare(item(1),item(3))

这次返回1,因为12 跟随 9,意味着项目(3)现在是到目前为止找到的最小项目。现在,我们进行比较:

compare(item(3),item(4))

在这种情况下,比较return -1,因为9在26之前,导致我们进行最后的比较:

compare(item(3),item(5))

此调用将返回+1,因为9在4之后。由于我们已经耗尽了列表中的所有项目,我们知道item(3)是最小的项目。然后我们将该项交换为“之前”的顶部项目,并从项目(2)开始重复整个过程。这是一个臭名昭着的低效“冒泡排序”的例子,但是出于说明的目的。这就是“第一项”和“第二项”引用的来源。排序,无论语言如何,和计算机科学中的任何其他问题一样,归结为将小问题分解为大问题,并且排序归结为反复比较较大列表中的两个项目。

答案 1 :(得分:0)

首先,阅读手册。 summary page是查看指定种类的好地方。回答你的一些问题:

当然,排序会扫描所有数组元素。怎么会知道最后一个元素的位置?但这并不是真的相关。您不需要了解使用哪种排序算法。您只需要提供一个知道如何比较数组中任何两个项目的函数,而不考虑任何其他项目

排序算法发挥其神奇作用,只要想知道哪个元素“在另一个之前”,就会调用你的函数。它使用两个项目调用您的函数,每个项目都作为参数。

你的函数返回:

    如果第一项小于第二项,则
  • -1(或任何小于零的数字)。
  • 如果相等则为0
  • 如果第一项大于第二项,则
  • 1(或任何大于零的数字)。

您可以编写一种方法来执行任何类型的排序。如果你想'w'在'b'之前,那么如果第一个参数以'w'开头而第二个参数以'b'开头,则你想要返回-1。对于我来说,编写一个示例函数是太费力了。

但在你学习如何编写回调之前,你首先需要有一个理由进行排序,这样你才能实现目标。

运行此示例以查看sort函数调用回调的次数:

<?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);

它使用排序算法系统地对数组进行排序,方法是使用函数告诉它的有关如何订购两个单独项目的信息。