【问题标题】:PHP elseif statement not executed even though initial if statement is false即使初始 if 语句为 false,PHP elseif 语句也不会执行
【发布时间】:2023-04-07 19:27:01
【问题描述】:

我正在编写一个递归函数来打印出 2 个多维 php 数组之间的差异。此代码的目的是查看 jpeg 标头之间的差异,以确定 adobe bridge cs3 如何在 jpg 文件中保存评级信息。

当我使用我的 eclipse - zend 调试器 ide 单步执行代码时,似乎即使初始 if 语句为假(即,两个值都不是数组),后续 elseif 语句也不会执行。函数附在下面。

注意:自基于 cmets 的原始帖子以来的更改
添加了默认级别=''
删除了 if{} elseif{} 块之间的 cmets
删除了一个else;在没有功能的块的末端 对 符号进行编码,以便尖括号会显示在我的代码中

函数array_diff_multi($array1,$array2,$level=''){ $keys = array_keys($array1); foreach($keys 作为 $key) { $value1 = $array1[$key]; if(array_key_exists($key,$array2)){ $value2 = $array2[$key]; if (is_array($value1) && is_array($value2)){ // 检查它们是否都是数组,如果是则需要递归 array_diff_multi($value1,$value2,$level . "[ " . $key . " ]"); } elseif(is_array($value1) != is_array($value2)){ // 不需要递归,检查是否将数组与另一种类型进行比较 打印“
”。 $级别。 $key ."=>" 。 $ 价值 1 。 “作为数组,与”相比。 $value2 ."
"; } elseif($value1 != $value2){ // 值不匹配,打印差异 打印“
”。 $级别。 $key ."=>" 。 $value1 ." != " . $value2 ."
"; } } 别的{ 打印“
”。美元级别。 $键。 “在array2中不存在”; } } }

【问题讨论】:

  • 您能给我们提供您用于$array1$array2 的样本
  • 也许你误会了——如果 value1 和 value2 都是数组,那么第一个 if 语句的计算结果为 true,并且 elseifs 将被忽略...如果一个值是数组而另一个是数组,则第一个 elseif 应该触发不对?此外,(我认为)is_array 将返回 true/false - 所以使用“!==”而不是“!=”是一个好习惯。
  • 是的,我确实打错了。我已经更正了原始问题中的示例。问题出现在比较第一个数组的第二级递归中,即 item1[0][n] 与 item2[0][n] 两者的值现在都是整数。
  • Josh - 我到达原始“if”的行,然后它跳回到循环的顶部并比较列表中的下一个项目。
  • thetaiko - 我使用的数组非常大。它们是图像文件中的 jpeg 标头,至少有 4 个维度和维度内的许多元素。如果我使用 print_r() 打印数组,它会超出 32K 长度限制。

标签: php recursion control-flow


【解决方案1】:

可能是因为你有

else;

最后...?

尝试将其删除或将其转换为“真实代码”

【讨论】:

  • 我删除了 else;线。该函数的行为方式仍然相同。在它启动递归函数以开始比较第一个数组即 item1[0][n] 与 item2[0][n] 后出现问题,其中两者的值现在都是整数。
【解决方案2】:

这里对我来说很好用。我把你的函数(与在 level 参数中添加默认值 '' 的细微差别)和这两个数组:

$a1 = array('foo', 'bar', 2, array('baz', '3', 4, array(54,45)));
$a2 = array('faz', 'bar', 4, array('buz', '3', 5, 54));

得到了这个输出:

0=>foo != faz

2=>2 != 4

[ 3 ]0=>baz != buz

[ 3 ]2=>4 != 5

[ 3 ]3=>Arrayas array, compared to  54

也许您的起始数组不是您认为的那样......?

【讨论】:

  • 添加默认值是个好建议。当我单步执行我的代码时,$array1 变量继续显示原始数组而不是第二级。我需要在 php 中做一些不同的事情来按值传递数组吗?
  • 嗯?你的意思是$level 显示下一个级别,但 $array1 保持不变?那不应该发生。您在上面发布的代码正是您所拥有的吗?如果是这样,请尝试禁用您的调试器...如果不是,请使用确切的代码进行更新(因为您发布的内容实际上可以正常工作)...
  • 调试器表现异常。我关闭并重新启动了eclipse。现在看来我的代码工作正常,但我比较的数组之间没有区别!
  • 我认为这两个文件之间的元数据会有所不同,但显然情况并非如此。无论如何,我们现在有一个有用的函数可以快速指出 2 个多维数组之间的差异。感谢您的帮助以及其他专家指出格式更改建议和使用默认值的帮助
【解决方案3】:

这并不能完全回答您的问题,但我认为 Adob​​e Bridge 将元数据保存在与文件相同的目录中的点文件中。例如,排序信息保存在.bridgesort 文件中。

【讨论】:

  • 感谢您的提示。不知何故,我在 bridge 中创建的评级在 VISTA 中是可见的,即使我在复制 jpg 时没有将点文件复制到新目录。
【解决方案4】:

跳过所有elseifs 的唯一方法是两个变量不是数组并且相等。

【讨论】:

  • 我觉得奇怪的是连第一个 elseif 都没有达到。是否有由于递归导致的奇怪行为?当我在第一个 if 语句中突出显示该语句时,它显示结果为 false(都不是数组),但未达到后续 elseif。
  • 但如果它们都不是数组,那么第二个elseif 为假。
  • 您的意思是不是要把&& 改为||
  • Ignacio - 我打错了我的例子。它已在原始问题中更正
  • if 不检查它们中的 either 是否是数组,它会检查 both 是否都是数组。您的描述与您的代码不符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2019-05-20
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多