【问题标题】:How to separate a php array based on sql results?如何根据sql结果分离一个php数组?
【发布时间】:2013-09-21 10:34:09
【问题描述】:

我有一个 PHP 数据数组(facebook 用户 id),我想将其与存储在我的数据库中的数据(将包含数千个)进行比较。在数据库中找到的那些,我希望它们被分成一个新的数组。我不知道该怎么做。

所以我从这个数组开始
$ids = 3312312,1232424,1242234,2342636,457456,345345

并以两个结尾
$found = 34234234,234234234
$notfound = 23234234,234234,23423423

如果有人可以提供帮助,那就太好了。我已经开始了这几种不同的方式,但没有走得很远。理想情况下,我希望一次完成这种比较,但我不确定这是否可能。

谢谢!

编辑

根据您的说法,我很快就想出了以下代码。这似乎是你得到的,但我一直无法慢慢建立到这一点,所以我不确定它是否正确。

<?php
$con=mysqli_connect("localhost","root","","sabotage");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

//json array is being posted to this file from another page
$jsonarray = '[{"name":"Lizzie OBrien","id":"218101335"},{"name":"Ellis Ward","id":"512376340"}]';
$friendlist = json_decode($jsonarray, true);

$found = [];
$notfound = [];

foreach($friendlist as $friend){

    $friendid = $friend['id'];
    $checkUserID = mysql_query("SELECT facebookid from users WHERE facebookid = '$friendid'");

    if (!$checkUserID) {
        die('Query failed to execute for some reason');
    }

    if (mysql_num_rows($checkUserId) > 0) {
        $found[] = $id;
    }else{
        $notfound[] = $id;
    }

}


mysqli_close($con);

?>

这给了我:

由于某种原因无法执行查询

我的 facebookid 列是整数有区别吗?

谢谢

【问题讨论】:

  • 利用 in_array()
  • 但我认为我需要整个 SQL 值数组?我很可能会将大约 500 个数组与数万个 sql 行进行比较。
  • 它们是如何存储在数据库中的?
  • 我不确定。你可能会说我不是这方面的专家。我的表有 3 列,id(主键、自动增量、整数)、name(varchar)和 facebookid(int)。这是我正在查看的facebookid。干杯

标签: php sql arrays comparison


【解决方案1】:

我会怎么做:

$idsfromdb; //grab all ids from the db, and put in array
$idstobetested; //array of all ids you want to compare
$found = [];
$notfound[];

foreach($idstobetested as $id){
  if(in_array($id, $idsfromdb)){
    $found[] = $id;
  }else{
    $notfound[] = $id;
  }
}

但是:

看到您的评论后,如果您的数据库有大量记录,而不是全部选择并放入数组中。相反,遍历您要测试的 id 数组并在 db 上运行选择查询,如果不返回 false,则该值存在于 db 中,然后您可以将 id 推送到找到的数组。

这可能有用:How to check if value already exists in MySQL database

【讨论】:

  • 谢谢。从您提供的链接中,我实际上一直未能使该代码正常工作。尽管我确定我的行名和表名是正确的,但出现“由于某种原因无法执行查询”错误。这就是为什么我想的东西,我会重新开始并问:P
  • 也许是因为我似乎将 mysqli 查询与 mysql 查询混合在一起。将继续调查。
  • @themartin 如果你用你的代码更新你的问题,如果你愿意,我可以看看?
  • 我会试试的。这个问题有几个部分,我还没有让它们中的任何一个单独工作,所以它可能没有任何意义。给我一分钟。
【解决方案2】:

这是为我完成的代码。没有你的帮助,我做不到。

<?php
$con=mysql_connect("localhost","root","");
// Check connection
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

//json array is being posted to this file from another page
$jsonarray = '[{"name":"Lizzie OBrien","id":"218101335"},{"name":"Ellis Ward","id":"512376340"}]';
$friendlist = json_decode($jsonarray, true);


$found = [];
$notfound = [];

foreach($friendlist as $friend){

    $friendid = $friend['id'];
    mysql_select_db("sabotage", $con);
    $result = mysql_query("SELECT facebookid FROM users WHERE facebookid ='$friendid'", $con);

    if (mysql_num_rows($result) > 0) {
        $found[] = $friendid;
    }else{
        $notfound[] = $friendid;
    }

}

mysql_close($con);

?>

【讨论】:

  • 毫无疑问你的答案会奏效。但是您正在循环执行查询,这意味着如果您有 1000 条记录,则必须运行 1000 次查询。这不是优化的方式。
【解决方案3】:

您可能正在寻找此功能。

$jsonarray = '[{"name":"Lizzie OBrien","id":"218101335"},{"name":"Ellis Ward","id":"512376340"}]';
$friendlist = json_decode($jsonarray, true);

$friendIds = array_map( create_function('$data', 'return $data["id"];'), $friendlist);

// Will return all the matched records
$sql1 = "SELECT yourcolumnname FROM yourtablename WHERE facebookid IN (".implode(',', $friendIds).")";

// Will return all the unmatched records
$sql2 = "SELECT yourcolumnname FROM yourtablename WHERE facebookid NOT IN (".implode(',', $friendIds).")";

【讨论】:

  • 谢谢你,但由于一个数组(来自数据库)将有数千个,我不能这样做。
  • 根据所有可能的解决方案,您必须从数据库中获取所有 facebook id。而是对所有 id 执行查询,您可以使用 in 查询。
  • 我知道我是新手,但我认为我没有从数据库中获取所有 ID。这将是很多数据。根据我最近的编辑,我想我需要先检查数据库,然后再采取行动。
  • 谢谢你,看起来很有希望。我已将此添加到您提供的代码$result = mysql_query($sql1); if (!$result) { // add this check. die('Invalid query: ' . mysql_error()); } $row = mysql_fetch_array($result); echo $row['facebookid']; 的末尾,但最终出现无效查询:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '' 附近使用正确的语法
猜你喜欢
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 2012-04-20
相关资源
最近更新 更多