2010-01-26 80 views
1
$categories = array("google","adobe","microsoft","exoot","yahoo"); 
$sql='google,exoot,adobe';//from mysql_query 
$categs = explode(",",$sql); 

for($x=0;$x<count($categs);$x++){ 
    for($y=0;$y<count($categories);$y++){ 
     if($categs[$x] == $categories[$y]){ 
      $str .= $y.","; 
     } 
    } 
} 

echo str; // 0,3,1, 

這段代碼會影響頁面渲染時間嗎?我可以使用其他快速方法嗎?PHP for循環會影響頁面加載速度嗎?

在此先感謝。

回答

2
$str = implode(',', array_keys(array_intersect($categories, $categs))); 
+1

這不是什麼他要。注意他是如何連接INDEX而不是VALUE的。 – LiraNuna 2010-01-26 08:39:42

+0

它返回字符串(谷歌,土坯,exoot),而不是數組的數量(0,3,1,) – exoot 2010-01-26 08:41:52

+1

array_intersect array_keys圍繞array_intersect返回級聯INDEXES,謝謝LiraNuna – Karsten 2010-01-26 08:42:45

0

您可以使用array_intersect()找到共同的項目,然後用implode()構建一個逗號分隔的列表:

Str = implode(',', array_intersect($categories, $categs)) . ','; 

除非你正在處理大量項目(千)它的不會影響頁面速度。一個問題是這個交點是O(n )。將值放入關鍵字可以大大加快速度,因爲從O(n)到接近O(1)的查找時間會改變整個操作O(n)。

0

我不認爲str_replace比所有的陣列功能,更快的方法,但另一種可能的解決方案是:

$categories = array("google","adobe","microsoft","exoot","yahoo"); 
$sql='google,exoot,adobe';//from mysql_query 

foreach($categories as $i=> $c) { 
    $sql = str_replace($c, $i, $sql); 
} 
0

是的,它會因爲你是在一個循環中循環。

最好的事情是在陣列檢查:

$categories = array("google","adobe","microsoft","exoot","yahoo"); 
$sql='google,exoot,adobe';//from mysql_query 
$categs = explode(",",$sql); 
$str = array(); 

foreach($categs as $id => $categs_check) 
{ 
    if(in_array($categs_check, $categories)) 
    { 
     //its better to put it into a array and explode it on a later point if you need it with comma. 
     $str[] = $id; 
    } 
} 

我不能完全肯定你正在嘗試做的,但它應該是像上面

0
$arrCategories = array("google","adobe","microsoft","exoot","yahoo"); 
$sql='google,exoot,adobe';//from mysql_query 
$arrCategs = explode(",",$sql); 
$arrAns = array(); 

for($i = 0, $intCnt = count($arrCategs); $i <= $intCnt; $i++) { 
    if(in_array($arrCategs[$i],$arrCategories)) { 
     $arrAns[$arrCategs[$i]] = array_search($arrCategs[$i], $arrCategories); 
    } 
} 

print "<pre>"; 
print_r($arrAns); 
print "</pre>";