PHP中的“==”和"strcmp"的区别

Difference between "==" and "strcmp" in PHP

我被要求创建模拟 array_keys function,但检查相等性 "==" returns false。 但是 "strcmp ($a, $b) == 0" return true.

class Utility
{
    public function convertArrayKeys(array $array)
    {
        $i = 0;
        $elements = [];
        foreach ($array as $element=>$value) {
            $elements[] = '  ' . $i++ . " => '" . $element . "'";
        }

        return 'array ( ' . implode(', ', $elements) . ', )';
    }

    public function testStrings(array $array)
    {
        $arrayOur = $this->convertArrayKeys($array);
        $arrayPhp = var_export(array_keys($array),true);
        if ($arrayOur == $arrayPhp){
            echo 'They are identical :)';
        } else {
            echo 'They are not identical :(';
            echo '<br>';
            print_r(str_split($arrayOur));
            echo '<br>';
            print_r(str_split($arrayPhp));
        }
    }
}

查看:

$repository = array('box'=>'blue', 'cube'=>'red', 'ball'=>'green');
$utility = new Utility();

echo "OUr array_keys: ";
echo $utility->convertArrayKeys($repository);
echo "<br />";
echo "PHP array_keys: ";
print_r (var_export(array_keys($repository)));

echo "<hr >";
echo "<br />";

echo $utility->testStrings($repository);

我很想知道,因为

您好,请不要在 PHP 中使用 ==。它不会做你期望的。即使您将字符串与字符串进行比较,PHP 也会隐式地将它们转换为浮点数,并在它们出现数字时进行数字比较。

试试这些就知道原因了

$something = 0;
echo ('password' == $something) ? 'true' : 'false';// true

$something = 0;
echo ('password' === $something) ? 'true' : 'false'; // false

echo strcmp('password123',$something); // 1

编辑:两者在 THIS 实例中不起作用的原因是您的函数不产生相同的输出:您的函数产生:

array ( 0 => 'box', 1 => 'cube', 2 => 'ball', )

其中 php 函数产生:

array ( 0 => 'box', 1 => 'cube', 2 => 'ball', )

如果您要在 Web 浏览器中查看它,我认为 Web 浏览器渲染器会进行空格欺骗。但是尝试在它周围放置呃 <pre> 标签(或在命令行中 运行 进行检查)。


基本上 == 做更多然后比较两个值 - 文档建议 "after type juggling"。你可以通过使用 == 比较字符串得到一些奇怪的东西。一个很好的例子是:'1e3' == '1000'。有时使用 == 很有用,但可能不与字符串一起使用。

Strcmp 也不是 return 一个 true/false 答案,而是一个 -1, 0, 1 答案,表明哪个字符串按字母顺序排在另一个前面。

您还应该看看 ===,它也有有用的用途,但就我个人而言,我会坚持使用带有字符串的 strcmp。

因为它们不是数组,而是字符串。数组不是这样创建的。你这样做是不对的。那么它们是数组吗

if ($arrayOur == $arrayPhp)

会评估为真。但它们只是字符串和

"strcmp ($a, $b) == 0"

不是return,因为第一个字符串中有空格,

 return 'array ( ' . implode(', ', $elements) . ', )';

你完全错了。你需要纠正你的做法。