2014-12-13 30 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

相關問題