2013-05-04 131 views
1

我有以下方法:array_splice刪除多個項目

public function selectFinal(){ 
    $db = new Database(); 
    for($i = 0; $i < 5; $i++){ 
     $key_id = mt_rand(0, count($this->candidates) - 1); 
     $itm = $this->candidates[$key_id]; 
     $host = $itm["host"]; 
     $item = $itm["item"]; 
     $db->query("insert ignore into trends (trend_id, host, item) values (?, ?, ?)", array($this->nextId, $host, $item)); 
     array_splice($this->candidates, $key_id, -1); 
     print_r($this->candidates); 
     $this->nextId++; 
    } 
} 

對於print_r()我得到這樣的輸出:

Array 
(
    [0] => Array 
     (
      [host] => www.youtube.com 
      [item] => IytNBm8WA1c 
     ) 

    [1] => Array 
     (
      [host] => www.youtube.com 
      [item] => kffacxfA7G4 
     ) 

    [2] => Array 
     (
      [host] => www.youtube.com 
      [item] => kXYiU_JCYtU 
     ) 

    [3] => Array 
     (
      [host] => www.youtube.com 
      [item] => 7AVHXe-ol-s 
     ) 

    [4] => Array 
     (
      [host] => www.youtube.com 
      [item] => qkM6RJf15cg 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [host] => www.youtube.com 
      [item] => IytNBm8WA1c 
     ) 

    [1] => Array 
     (
      [host] => www.youtube.com 
      [item] => qkM6RJf15cg 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [host] => www.youtube.com 
      [item] => qkM6RJf15cg 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [host] => www.youtube.com 
      [item] => qkM6RJf15cg 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [host] => www.youtube.com 
      [item] => qkM6RJf15cg 
     ) 

) 

的陣列將與它5個或更多的項目開始。我想要做的是從數組中選擇一個隨機項並將其插入數據庫,然後將其從數組中移除。我想這樣做5次,以獲得陣列中的5個隨機項目。但由於某種原因,它選擇1然後從數組中刪除3項,我不知道爲什麼(顯示在代碼的第二部分)。

編輯:最後的工作結果

public function selectFinal(){ 
    $db = new Database(); 
    for($i = 0; $i < 5; $i++){ 
     $key_id = mt_rand(0, count($this->candidates) - 1); 
     $itm = array_values(array_merge([$this->nextId], array_splice($this->candidates, $key_id, 1)[0])); 
     $db->query("insert ignore into trends (trend_id, host, item) values (?, ?, ?)", $itm); 
     $this->nextId++; 
    } 
} 

回答

1

你更拼接安全元素並使用該通氣管。如果你犯了錯誤,你會注意到沒有正確的值來存儲。這會讓你更加意識到潛在的問題:

$key_id = mt_rand(0, count($this->candidates) - 1); 
$itm = array_splice($this->candidates, $key_id, -1); 
var_dump($itm); 

請參閱?然後,您可以更好地指出問題,例如-1不是1。請參閱http://php.net/array_splice

public function selectFinal() { 
    $db = $this->db; 

    for ($i = 0; $i < 5; $i++) 
    { 
     $key_id = mt_rand(0, count($this->candidates) - 1); 
     $values = array_merge(
      [$this->nextId], array_splice($this->candidates, $key_id, 1) 
                    ### 
     ); 

     print_r($this->candidates); 

     $db->query(
      "insert ignore into trends (trend_id, host, item) values (?, ?, ?)", 
      array_values($values) 
     ); 

     $this->nextId++; 
    } 
} 
+0

完美!並且使用'1'而不是'-1'也有幫助! – 2013-05-04 20:32:18

+0

是的,這是一個小提示。我只是再次編輯,一個代碼示例留下了一些更多的提示:不要爲每個方法調用創建新的Database(),而是使用私有成員來存儲它。此外,它顯示了一個小技巧來創建可能在您的情況下工作的數組值,以使數據庫查詢更易於調用。 – hakre 2013-05-04 20:34:18

+0

'$ values'等於'Array ( [0] => 201305042040 )'當我這樣做時。 – 2013-05-04 20:40:04

0

如果你只是想刪除某個特定鍵的數組項,你可以使用 - 這偉大工程

unset($this->candidates[$key_id]) 
+2

這將在密鑰空間中留下一個空洞,導致在進一步的迭代中出現(潛在的)錯誤。 'array_splice()'通過不保存數字鍵來消除這些差距。 – hakre 2013-05-04 20:25:46

+0

是的,如果他進一步嘗試迭代相同的數組,但在代碼中他沒有使用密鑰迭代 – smm 2013-05-04 20:27:55

+0

還有,至少4次進一步因爲5次迭代:*「我想這樣做5次從陣列中獲得5個隨機物品。「* – hakre 2013-05-04 20:28:11