Tag Archives: array

Trích ra ngẫu nhiên một số phần tử của mảng

<?php
/**
* Hàm lấy ra ngẫu nhiên $n phần tử từ một mảng $arr
* Trong đó có $fix phần tử là các phần tử đầu tiên của mảng $arr
* (Thực chất số phần từ ngẫu nhiên chỉ là $n – $fix)
* @param array $arr Mảng các phần tử (e1, e2, e3)
* @param int $n Tổng số phần tử sẽ lấy ra
* @param int $fix Số phần tử lấy ra từ đầu mảng
* @return array Mảng các phần tử thu được
*/
function getRandomItems($arr, $n=5, $fix=3) {
    #$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17);
    $total = count($arr);
    if ($n >= $total) {
        return $arr;  
    }
    $ret = array();
    
    for($i = 0; $i < $fix && $i < $total; $i++) {
        $ret[] = $arr[$i];
        unset($arr[$i]);
    }
    
    #echo implode(',', $ret);
    #echo " – ";
    #echo implode(',', $arr);
    
    if ($n > $fix && $n < $total) {
        $arrRandKey = array_rand($arr, $n – $fix);
        foreach ($arrRandKey as $key) {
            $ret[] = $arr[$key];
        }
    }
    #echo "\n";
    #echo implode(',', $ret);
    return $ret;
}

Đẩy dữ liệu từ mảng vào database

Mảng thì to mà thân em MySQL thì nhỏ!
MySQL cho phép chèn nhiều records qua một câu lệnh kiểu như sau
# Câu lệnh insert multiple:
INSERT INTO bảng VALUES (bộ giá trị thứ nhất), (bộ giá trị thứ hai), … (bộ giá trị thứ N);

Vì thế khi đẩy dữ liệu từ mảng vào database ta có thể tạo ra câu lệnh SQL như vậy, thay vì với mỗi phần tử của mảng ta lại tạo ra một bộ và INSERT INTO bảng VALUES (bộ giá trị có được);

Tuy nhiên do cấu hình max_allowed_packet, ta chỉ thực thi được câu lệnh chèn đồng thời 1 phát nhiều bản ghi với chỉ số N giới hạn.

Do đó, code phân tách mảng và generate ra các câu SQL nên làm như sau
<?php
$prefixSQL = 'INSERT INTO phimconheo(id, title, description, source, price, available) VALUES ';
$i = 0;
foreach ($data as $record) {
    $id = intval($record['id']);
    $title = addslashes($record['title']);
    // same above for other fields
    
    $sql .= "($id, $title, $description, $source, $price, $available),";
    $i++;
    if ($i == LIMIT_EXECUTABLE) {
        $sql = substr($sql, 0, strlen($sql) – 1) . ";";
        $sql = $prefixSQL . $sql;
        echo $sql . "\n";
        $i = 0;
        $sql = '';
    }
}

if ($sql != '') {
    $sql = substr($sql, 0, strlen($sql) – 1) . ";";
    $sql = $prefixSQL . $sql;
    echo $sql . "\n";
}