【问题标题】:Compare two arrays in mysql and php比较mysql和php中的两个数组
【发布时间】:2014-06-02 16:29:20
【问题描述】:

我每天都有这么小的时间循环。

$datum = $date_final;
$iTimestamp = mktime(8,0,0,1,1,2014);
for ($i = 1; $i < $den; $i++) {
    $vypis = $datum.' '.date('H:i:s', $iTimestamp) . "\n<br />";
    $iTimestamp += $sekundy;
    echo $vypis;
}

它会回显如下内容:

2014-06-02 10:00:00 
2014-06-02 10:30:00 
2014-06-02 11:00:00 
2014-06-02 11:30:00 
2014-06-02 12:00:00 
2014-06-02 12:30:00 
2014-06-02 13:00:00 
2014-06-02 13:30:00 
2014-06-02 14:00:00 
2014-06-02 14:30:00 
2014-06-02 15:00:00 
2014-06-02 15:30:00 
2014-06-02 16:00:00 
2014-06-02 16:30:00 
2014-06-02 17:00:00 

我有第二个脚本 - mysql 查询循环

$data = mysql_query ("select * from evenement");
$zaznam = mysql_fetch_array ($data);
while($zaznam = mysql_fetch_array ($data))
{
echo $zaznam["start"];
}

它给了我类似的结果:

2014-05-25 19:30:00
2014-05-28 13:30:00
2014-04-21 09:30:00
2014-05-20 11:00:00
2014-05-28 13:00:00
2014-04-27 00:00:00
2014-05-21 12:00:00
2014-05-22 11:30:00
2014-05-20 13:00:00
2014-05-22 11:30:00
2014-05-28 15:30:00
2014-05-28 13:00:00

我正在尝试编写一个脚本,将每个 echo $vypis 与 mysql 查询中的所有结果进行比较。之后我可以很容易地把条件放在这里——如果它不在 mysql 中——回显“免费”,如果它在 mysql 中回显“....”。我想我可能必须使用 foreach 。 我需要将 php 循环中的一个结果与 DB 中的所有结果进行比较,应用条件和下一个结果,与所有结果进行比较.....

你们有什么想法吗?我需要一点帮助。

【问题讨论】:

  • 我建议修改第一个脚本片段以创建一个临时 MySQL 表并将日期插入其中。然后,第二个片段可以使用一些 SQL,在 evenement 和您的临时表之间建立连接。
  • 听起来不错,我没有在 mysql 中使用临时表的经验,所以我做不到。但这看起来真是个好主意!

标签: php mysql arrays compare


【解决方案1】:

将 php 数组值与所有 sql 值进行比较,如下所示(我希望这是您要问的)

for ($i = 1; $i < $den; $i++) {
    $vypis = $datum.' '.date('H:i:s', $iTimestamp) . "\n<br />";
    $iTimestamp += $sekundy;
    $arr1[]=$vypis;//store php values in first array
}

//and in php

while($zaznam = mysql_fetch_array ($data))
{
 $arr2[] = $zaznam["start"];//store query values in second array
}

//and now use forloops

foreach($arr1 as $k=>$val)
{
  if(in_array($val,$arr2))
  {
   echo '...';
  }
 else
 {
  echo 'Free';
 }
}

【讨论】:

  • 看起来它可以工作......但现在我到处都有免费价值,但在 mysql 我有 2014-06-02 08:00:00 值和 php 循环生成相同的值 2014-06 -02 08:00:00 ..现在我想在这里完整(或....)而不是免费。其他结果将是免费的,因为它们不在数据库中
  • 你能说清楚一点吗?如果可能的话,通过编辑你的问题来展示它是怎么来的。
【解决方案2】:

如果您只想找到差异,可以使用array_diff。但是如果你想检查每一个元素,你可以按照@Feroz Akbar 所说的那样做

【讨论】:

    【解决方案3】:

    将结果存储在 php 数组中

    $phpDateArray=array();
    $datum = $date_final;
    $iTimestamp = mktime(8,0,0,1,1,2014);
    for ($i = 1; $i < $den; $i++) {
        $vypis = $datum.' '.date('H:i:s', $iTimestamp) . "\n<br />";
        $iTimestamp += $sekundy;
        $phpDateArray[]=$vypis;
    }
    

    查询也一样:

    $mysqlDataArray=array();
    $data = mysql_query ("select * from evenement");
    $zaznam = mysql_fetch_array ($data);
    while($zaznam = mysql_fetch_array ($data))
    {
        $mysqlDataArray[]=$zaznam["start"];
    }
    

    然后用 array_search() 搜索

    foreach($phpDataArray as $key=>$time){
        if(array_search($time, $mysqlDataArray)===FALSE){
            echo $time. " free";
        } else {
            echo $time. " ...";
        }
    }
    

    这可以优化,但我遵循你的风格。

    array_merge 的另一个选项是这样的:

    $phpDateArray=array();
    $datum = $date_final;
    $iTimestamp = mktime(8,0,0,1,1,2014);
    for ($i = 1; $i < $den; $i++) {
        $vypis = $datum.' '.date('H:i:s', $iTimestamp) . "\n<br />";
        $iTimestamp += $sekundy;
        $phpDateArray[$vypis]="free";
    }
    
    $mysqlDataArray=array();
    $data = mysql_query ("select * from evenement");
    $zaznam = mysql_fetch_array ($data);
    while($zaznam = mysql_fetch_array ($data))
    {
        $mysqlDataArray[$zaznam["start"]]="start";
    }
    
    $resultArray = array_merge($phpDateArray, $mysqlDataArray);
    foreach($resultArray as $time=>$value){
        echo $value;
    }
    

    【讨论】:

      【解决方案4】:

      可以像这样使用临时表:-

      <?php
      
      $datum = $date_final;
      $iTimestamp = mktime(8,0,0,1,1,2014);
      for ($i = 1; $i < $den; $i++) 
      {
          $vypis = $datum.' '.date('H:i:s', $iTimestamp) . "\n<br />";
          $aDate[] = $vypis;
          $iTimestamp += $sekundy;
          echo $vypis;
      }
      
      $sql = "CREATE TEMPORARY TABLE tmp_date (aDate DATETIME, INDEX aDate(aDate))";
      $data = mysql_query ($sql);
      $sql = "INSERT INTO tmpdate(aDate) VALUES ('".implode("','", $aDate)."')";
      $data = mysql_query ($sql);
      
      $sql = "SELECT a.start
              FROM evenement a
              INNER JOIN tmp_date b
              ON a.start = b.aDate";
      $data = mysql_query($sql);
      $zaznam = mysql_fetch_array ($data);
      echo "List if start dates that are in the generated list of dates\r\n";
      while($zaznam = mysql_fetch_array ($data))
      {
          echo $zaznam["start"]."\r\n";
      }
      
      $sql = "SELECT a.start
              FROM evenement a
              LEFT OUTER JOIN tmp_date b
              ON a.start = b.aDate
              WHERE b.aDate IS NULL";
      $data = mysql_query($sql);
      $zaznam = mysql_fetch_array ($data);
      echo "List if start dates that are not in the generated list of dates\r\n";
      while($zaznam = mysql_fetch_array ($data))
      {
          echo $zaznam["start"]."\r\n";
      }
      
      $sql = "SELECT a.aDate
              FROM tmp_date b
              INNER JOIN evenement a
              ON a.start = b.aDate
              WHERE a.start IS NULL";
      $data = mysql_query($sql);
      $zaznam = mysql_fetch_array ($data);
      echo "List if generated dates that are not in the list of start dates\r\n";
      while($zaznam = mysql_fetch_array ($data))
      {
          echo $zaznam["start"]."\r\n";
      }
      
      ?>
      

      临时表仅在数据库连接存在的时间内存在(并且仅用于该数据库连接)。如您所见,易于创建并将行插入其中。

      脚本的其余部分将日期放在两个列表中、一个列表中或另一个列表中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-19
        相关资源
        最近更新 更多