2014-12-13 63 views
0

我想要做这样的事情如何在PHP中的数组使用


---- SQL输出mysql数据库中的数据----
名TEXT
b
删除C项


$arr = ["a","b","c","d"]; 

foreach($arr as $key=>$val){ 
    $query = "select count(*) from mydata where name = $val"; 
    $count = xxxx($query); 
    if($count)unset($arr[$key]); 
} 

而且$ ARR会
a,d

任何简单的方法来做到这一点,但不检查每一个元素?


---编辑---
我想我解决我的问题...我得到了一些来自mrlore是使用具有启发。

$arr = ["a","b","c","d"]; /* make the string inside arr safe for query */ 
$val = array_map(function($val){return "'$val'";},$arr); 
$q = "select name from mydata where name in (" . implode(',',$val) .")"; 
$all = xxxxx($q); 
$arr = array_diff($arr,$all); 

这花了我0.8秒。使用我以前的方式需要46秒,RST方式需要2秒。


---编辑----
我有超过20万行数据在我的数据库,所以我希望有一个更好的方式来优化它。


--re MrLore--
PS:我不知道如何使用计算器张贴comments..so我只是编辑自己的帖子。

我已经在我的mysql工作台上试过了,但它似乎不适用于我。

select name from mydata 
where name in("a","b","c","d") 
having count(name) = 0 

- 没有返回

select name from mydata 
where name in("a","b","c","d") 
having count(name) > 0 
+0

集中SQL语句和用户输入是危险的(SQL注入)尝试使用预准备语句。看看php PDO – 2014-12-13 14:02:23

+0

在你的问题中,所有这些虚线和评论是什么?清理它,所以它有道理? – MightyPork 2014-12-13 14:02:25

+0

@MightyPork对不起。我是新的stackoverflow.I不知道如何使用这些格式化。 – stny 2014-12-13 16:11:39

回答

0
$arr = ["a","b","c","d"]; 

    $query = "select DISTINCT name from mydata"; 
    $results = <result of query>; 

    foreach ($results as $result){ 
     if(($key = array_search($result, $arr)) !== false) { 
     unset($arr[$key]); 
     } 
    } 

或者周围的其他方法

foreach ($arr as $key=>$value){ 
     if(in_array($value, $results)) { 
     unset($arr[$key]); 
     } 
    } 

通过查询DISTINCT数据库只返回唯一值。然后,您可以将它们与您拥有的阵列进行比较并将其删除。

+0

我的数据库中有超过200k的数据。所以我想要一些更好的方法来优化它。大部分我的PHP数组都比那些已经在我的数据库上的数组小。 – stny 2014-12-13 12:46:40

+0

我想in_array会让它变得更慢。来自sql和来自数组的3000个数据超过200k。 – stny 2014-12-13 13:21:49

+0

另一种方法是将'$ arr'内容作为'name'添加到(临时)表中,并查询临时表中不存在于表mydata中的'name'条目 – RST 2014-12-13 14:02:38