【问题标题】:How can I compare two arrays of data retrieve from database?如何比较从数据库中检索的两个数据数组?
【发布时间】:2014-07-07 07:06:30
【问题描述】:

我有两个数组。在一个数组中,我存储一张表中的数据。我将另一个表中的数据存储在另一个数组中。我想比较两个数组的数据。如果第一个数组的数据在第二个数组中,我想继续。我该怎么做?

我尝试了以下代码,但它不是工作事件,尽管 array1 数字存在于 array2 中:

$x = "SELECT * FROM table1";
$data1 = mysqli_query($link, $x);
$dat1 = array()
while($row1= mysqli_fetch_array($data,MYSQLI_ASSOC))
{
  $dat1[] = $row1;
  $f1 = $row1['fid'];
}

$y = "SELECT * FROM table2";
$data2 = mysqli_query($link, $y);
$dat2 = array()
while($row2= mysqli_fetch_array($data2,MYSQLI_ASSOC))
{
  $dat2[] = $row2;
  $f2 = $row2['fid'];
}

if(in_array($dat1,$dat2))
{
  // if exists proceed
}
else
{
  // if not show error
}

【问题讨论】:

  • 请提供正反两例。请注意,您在代码中将 $dat2 拼错为 $dta2
  • 提问者,if(in_array($data,$dta2)) 中的$dta2 是错字吗?
  • 哈哈,这只是一个错字...当我检查 if(atleast one of data2 matches with data1) { //procesed }else { //show error} 时让 data1 = 1、2,3 和 data2= 1
  • @Thauwa 绝对是错字。我修好了。

标签: php sql mysqli


【解决方案1】:

这可以通过 SQL 来完成。

检查table1中的所有fid是否都在table2中:

SELECT COUNT(a.fid) FROM table1 AS a WHERE a.fid IN (SELECT b.fid FROM table2 AS b)

SELECT COUNT(*) FROM table1

如果两个值相等,那么table1中的所有fid都在table2中。

【讨论】:

    【解决方案2】:
    if(in_array($data,$dat2))
    {
      //if exists proceed
    }
    else
    {
      //if not show error
    }
    

    你为什么把 $data 放在这里?应该是 $dat1 没有?

    【讨论】:

      【解决方案3】:

      你可以这样使用

       $bool=0;
       foreach ($dat1 as $a) {
          foreach ($dat2 as $b) {
              if($a==$b)
              {
                  $bool=1;
                  break;
              }
              else
              {
                  $bool=0;
              }
          }
          if($bool==1)
          {
              break;
          }
       }
       if($bool==1)
       {
         //proceed
        }
       else
        {
           //error
         }
      

      在这里,如果 dat2 中的任何值存在于 dat1 中,那么它将为 true,您可以继续。

      【讨论】:

        【解决方案4】:

        根据您最后的评论,您的代码中的逻辑是错误的。您当前正在将所有行从 mysql 返回中拉入 $dat1 变量,因此您无法通过将整个数组用作单个值来检查第二个数组中是否存在特定值。您还在 while 循环的每次迭代中覆盖 $f1。

        您可以像这样检查从您的第一个数组返回的每个 ID。

        $x = "SELECT * FROM table1";
        $data1 = mysqli_query($link, $x);
        $dat1 = array()
        while($row1= mysqli_fetch_array($data,MYSQLI_ASSOC))
        {
          $dat1[] = $row1;
          $f1 = $row1['fid'];
          $y = "SELECT * FROM table2 where fid = ".$f1;
          $data2 = mysqli_query($link, $y);
          $dat2 = array();
          while($row2= mysqli_fetch_array($data2,MYSQLI_ASSOC))
          {
            //data exists in table2
          }
        }
        

        【讨论】:

        • 不,它们并不完全相同,只是想检查 $dat1 是否存在 $dat2
        【解决方案5】:

        正如 sotirojo 刚刚指出的,当你可以在数据库中做数据时,不要尝试用 PHP 做数据!
        所以在我看来,任何告诉你如何在 PHP 中解决问题的答案都是错误的答案。

        SELECT table_1.* 
           FROM table_1
           JOIN table_2 USING(fid)
        

        会将两个 table_1 中存在的所有行都返回为 table_2

        SELECT table_1.* 
           FROM table_1
           LEFT JOIN table_2 USING(fid)
        WHERE table_2.fid IS NULL
        

        将返回 table_1 中不在 table_2 中的所有行

        等等。

        使用您的数据库来处理数据。

        【讨论】:

          【解决方案6】:

          抛开sql部分,使用这个函数:

          function compare_array($arr1,$arr2)
          {
              foreach($element as $arr1)
              {    
                  foreach($element2 as $arr2)
                  {
                      if($element2 == $element)
                      {
                         return true;
                      }
                      else
                      {
          
                      }
                  }
           return false;
          }
          

          将您通过查询获得的两个数组传递给它,并在其返回时采取行动 它可能有点重,但如果我明白你需要什么,它应该可以工作

          【讨论】:

            【解决方案7】:

            根据:SQL for Dummies,INNER JOIN 会丢弃结果表中在两个源表中都没有对应行的所有行。

            试试:

            SELECT column_name(s)
            FROM table1
            INNER JOIN table2
            ON table1.column_name=table2.column_name;
            

            【讨论】:

              猜你喜欢
              • 2019-06-29
              • 2015-09-10
              • 2011-11-28
              • 1970-01-01
              • 2013-06-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多