【问题标题】:array issues when using ajax使用ajax时的数组问题
【发布时间】:2013-12-23 01:15:26
【问题描述】:

我正在尝试使用 ajax 来比较两个数组以查看特定值集是否相同,所以我用相同的值填充了两个数组,当我测试它们时,我的测试表明它们不一样。第一个数组是在 fileA.php 上创建的(带有直接从数据库中提取的 while 循环),并使用 ajax 将其作为 url 变量发送到 fileB.php(响应文件)。然后在 fileB.php 上,我使用 $_GET 来获取数组,并使用 while 循环创建另一个数组,直接从数据库中提取完全相同的值并比较两者。此时这两个数组应该是相同的,但正如我之前所说,我的测试表明它们不是。所以我对两个数组进行了 var_dump,但由于某种原因它们看起来不同。

第一个数组转储:

    array(2) {
  [0]=>
  array(0) {
  }
  [1]=>
   string(6)     ",2,2,1"
 }

第二个数组转储:

array(3) {
 [0]=>
 array(0) {
 }
 [1]=>
 string(1) "2"
  [2]=>
  string(1) "2"
  [3]=>
  string(1) "1"
 }

数组 1 是在 fileA.php 上创建的

      while ($row = mysql_fetch_assoc($res))
 {

    $iState[] = $row["state"];
 }///end while

然后我使用 ajax 发送到 fileB.php

   js_array=<? echo json_encode($iState); ?>;

   var url_js_array=js_array.join(',');

    xmlhttp.open("GET","fileB.php?istate="+ url_js_array,true);
xmlhttp.send();

然后在 fileB.php(ajax 响应文件)中检索数组

    $iStateValues[] =$_GET["istate"] ;

然后我在 fileB.php 上创建数组 2

     while ($row = mysql_fetch_array($res))
   {

     $currentiState[]= $row["state"];

      }///end while

然后我比较了两者

   echo"\n\nsame test\n";
   if($iStateValues==$currentiState)
   echo "same";
   else
   echo "not same";

两个数组的 var_dump 不同,但它们的创建方式完全相同。这是什么??????

【问题讨论】:

  • 我知道您提到您正在运行一个 while 循环并直接构建数组,但您能否给我们检查的代码?
  • 我用代码更新了我的帖子....
  • 问题在于 json_encode 和 javascript join。那就是你修改了数组。您不应该使用 join 函数,而是稍后使用 json_decode($_GET["istate"]);

标签: php ajax arrays


【解决方案1】:

实际上,您的数组并不相同。你的第一个数组(比如$arr1)有 2 个元素,而你的第二个数组(比如$arr2)有 4 个元素。

当然,这两个数组的第一个元素(即$arr1[0]$arr2[0])都是一个空数组,并且这部分数组是相似的。

现在,第一个数组的剩余部分(即$arr1[1])是一个字符串:",2,2,1",而第二个数组的剩余部分是更多的数组值:2, 2, 1,并且不是字符串。

即:

$arr1[1] #=> string: ,2,2,1
$arr2[1] #=> string: 2
$arr2[2] #=> string: 2
$arr2[3] #=> string: 1

因此,您可以清楚地看到两个数组不相等。

您可以使用=== 运算符比较两个数组是否相等(保持顺序),如下所示:

$arr1 === $arr2 #=> false

如果您只想检查两个数组是否具有相同的值(无论它们的顺序如何),您应该使用== 运算符。

【讨论】:

  • 是的,我看到了,但是我用同样的方式制作了数组......为什么它们会不同???
  • 我明白你的意思,但我使用相同的方法来创建两者......我会在上面添加一些代码来解释......
  • 是的,这肯定会有所帮助。
  • == 在这里很关键,因为 array(0,1) == array(1,0) 返回 true 但在他的示例中并不意味着相同...
  • @andreas:是的,你在这方面是正确的。更新了答案:)
【解决方案2】:

您的数组不相等,因为您在代码中修改了它们!

PHP:

// This is not an array, but a json string
js_array=<? echo json_encode($iState); ?>;

JS:

// Just pass the whole json string and don't use join!
xmlhttp.open("GET","fileB.php?istate="+ url_js_array,true);
xmlhttp.send();

PHP:

// Create an array again with json_decode
$iStateValues[] = json_decode($_GET["istate"]);

关于你的第二个问题,这是在 PHP 中比较数组的方法:

$array1 = array(1, 2, 3); // This is the same like $array1 = array(0 => 1, 1 => 2, 2 => 3);
$array2 = array(1, 2, 4);
$array3 = array(3, 2, 1);

var_dump($array1 == $array2); // false
var_dump($array1 == $array3); // false
var_dump($array2 == $array3); // true

var_dump($array1 === $array2); // false
var_dump($array1 === $array3); // false
var_dump($array2 === $array3); // false

“==”检查相同的元素,“===”检查正确的顺序。所以在你的情况下,'===' 会提供正确的答案。

【讨论】:

  • 为什么要投反对票?该操作没有提出明确的问题,因此我发布了一种比较 PHP 数组的方法。我现在添加了一个如何解决代码问题的建议。
猜你喜欢
  • 2019-04-23
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多