【问题标题】:usort and compare function with arguments PHPusort 和比较函数与参数 PHP
【发布时间】:2021-03-08 13:18:21
【问题描述】:

我有问题 我的代码有效,但我不明白函数中的 $x[1] 和 $y[1] 是什么 我试过 $x[0], $x[1], $x[2], $y[0], $y[1], $y[2] 并没有得到逻辑输出?我哪里理解错了?请问有人可以帮助我吗?

<?php
$products = array( array('TIR', 'Tires', 100),
                   array('OIL', 'Oil', 10),
                   array ('SPK', 'Spark Plugs', 4));

//print_r ($products); echo '<br />';
                 
function compare($x, $y) {
    if ($x[1] == $y[1]) {
        return 0;
    } else if ($x[1]<$y[1]) {
        return -1;
    } else {
        return 1;
    }
}

usort ($products, 'compare');

echo compare('Tires', 'Tires' );
echo compare('Oil', 'Spark Plugs' );
echo compare('Spark Plugs', 'Oil' );
echo compare('Tires', 'Tires');
echo '<br />';

此代码的输出是 echo 1、2、3、4:

0
-1
1
0

【问题讨论】:

  • $x 和 $y 是您尝试排序的数组中的两个元素,它们将被传递到您的比较函数中。所以$x[0] 是其中一个子数组的第一个元素,$x[1] 是第二个元素,依此类推。
  • 我明白,但我的问题是如果我放 $x[2] 和 $y[2],我会得到正确的输出,但是如果我放 $x[1] 和 $y[ 1]我无法理解输出?我在哪里理解代码有误?
  • 您的echo compare('Tires', 'Tires' ); 等低于实际的usort 调用,没有什么意义。这完全不同,在这里您将比较单词Tires 的第二个或第三个字母。这些陈述在这里毫无意义。如果你想看看你的排序数组是什么样子 - 然后 var_dump 它。
  • $x[0] 是什么,首先取决于您调用函数的方式。当usort 调用您的函数时,它会传入您的数组元素之一 - 所以 $x 可以 f.e.是array('TIR', 'Tires', 100),那么 $x[0] 当然会引用该数组的TIR 元素。当you 调用compare('Oil', 'Spark Plugs' ) 时,一开始就完全不同了——你在这里传递的不是参数数组,而是简单的字符串。所以 $x 现在是 Oil,并且使用 [0] 访问它的第一个字符,得到 O
  • “我得到错误或不合逻辑的输出” - 你在这里比较苹果和橘子; usort 调用比较函数的方式和调用它的方式根本不同。对于您在那里所做的事情,输出 “合乎逻辑的” - 但作为一种验证排序是否有效,或者您的比较函数是否正确用于该目的的方式,它是 合适。

标签: php arrays compare usort


【解决方案1】:

当您调用compare($x, $y) 函数时,您将字符串作为参数传递。这些字符串被视为具有从 0 开始的索引的数组。

所以,当echo compare('Tires', 'Tires' ); 被执行时,这两个字符串被传递,并根据比较函数,比较索引1处的字符(索引从0开始),即第二个字符。


因此,对于这个 ```echo compare('Tires', 'Tires' );```,比较的字符是 'i' 和 'i' 相等,因此返回 0。

所以,对于这个echo compare('Oil', 'Spark Plugs' );,比较的字符是“i”和“p”。 'i' 小于 p,因此返回 -1。要确定哪个字符比另一个小,请查找 ASCII 码。

其他函数调用以此类推。如果您仍有任何疑问,请告诉我。

我只为独立的echo compare('Oil', 'Spark Plugs' ); 行解释了这一点,而不是usort 函数。


更新为 usort 函数
让我先解释一下比较器功能的工作方式。每当将两个参数传递给比较函数时,它都会返回 true 或 false,这用于确定是否需要交换这些值。
在前面的例子中,echo compare('Tirez', 'Tires' );
$x = Tires
$y = Tirez
您比较$x[1]$y[1],特别是索引1 处的字符。但是如果在这些字符串的情况下,您只需执行$x &lt; &amp;y,这些字符串会根据英文的ASCII 码自动逐个字符进行比较字母和结果在第一个位置返回,字符不匹配。
即,如果您想比较一个字符串是否按字典顺序小于另一个字符串,那么您可以使用下面的比较器函数。

function compare($x, $y) {
    if ($x == $y) {
        return 0;
    } else if ($x < $y) {
        return -1;
    } else {
        return 1;
    }
}

输出将是1,因为在逐个字符比较'z' &gt; 's'


所以,当一个完整的数组被传递给比较函数时,前两个元素被传递。这里的数组$products是一个二维数组(数组的数组),所以传递了前两个数组

$x = array('TIR', 'Tires', 100),和
$y = array('OIL', 'Oil', 10)
所以,这取决于你的要求。例如,如果您想按 $products 的任何数组的索引 0 排序,即“TIR”、“OIL”、“SPK”,则将比较器函数更改为 $x[0]$y[0]

我希望你现在能够理解:)。

【讨论】:

  • $x 和 $y 是我在比较函数中定义的变量,如果我尝试比较字符串,我理解但不理解,如果我尝试比较 $x[0] 和 $y[ 0] 像数组中的第一个元素(TIR、OIL 等)?如果 T 和 O 喜欢字符串中的第一个 sting 元素,为什么我的输出是错误的?感谢您的回答,但我仍然有疑问?相同的输出是在 i //coment usort fnc 的情况下
  • @MilutinGavrilovic 你能告诉我你想要的输出吗?
  • 现在对于 $x[0] 和 $y[0] 以及对于 $x[1] 和 $y[1] 给我这个输出 4 回声 0,-1,1,0而且我无法理解如何给我相同的输出,因为 TIR 和轮胎、机油和机油、火花塞是相同的,但不是字母大小写。我的问题是:我到底检查了什么> TIR 或轮胎是 $x[0] 是 TIR(T) 还是 $x[1] 是轮胎(i) ...你现在能理解我吗?
  • 如果我想比较这个怎么办:echo compare ('TIR', 'SPK');这是 $x[0] 和 $y[0] 还是我拼错了什么?
  • 如果我想比较这个怎么办:echo compare ('TIR', 'SPK');这是 $x[0] 和 $y[0] 还是我拼错了什么?这个例子的输出在我脑海中并不清楚......在这种情况下:$x[0] 是 TIR 还是只是 T......我不明白我比较的是什么,我不明白这两种情况是什么TIR 和轮胎(那是参数 - 我认为)......但是为什么我不能比较例如 TIR 和 SPK - [0] - 如果我有好的想法,那就是 T 和 S?什么是 [0] TIR 或只是第一行的 T ?我现在清楚了吗?
猜你喜欢
  • 2012-02-14
  • 2010-11-16
  • 2010-11-08
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多