1

私は次の方法を持っています:

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 つの項目を削除していますが、その理由はわかりません (コードの 2 番目のセクションに示されています)。

編集:最終作業結果

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++;
    }
}
4

2 に答える 2

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++;
    }
}
于 2013-05-04T20:23:30.387 に答える