2010-05-02 46 views
8

Sự khác biệt chính xác giữa các hàm shufflearray_rand trong PHP là gì? Đó là nhanh hơn nếu không có sự khác biệt.Sự khác biệt về PHP giữa shuffle và array_rand

Cảm ơn

+4

+1: hoan nghênh và câu hỏi tốt, không bao giờ quan tâm đến điều đó ... –

+0

-1 chào mừng bạn đến SO và chúng tôi có thể giới thiệu bạn cũng php.net! – Ejaz

Trả lời

8

Khi được gọi vào một mảng, shuffle randomizes thứ tự của tất cả các yếu tố của mảng.

Ví dụ, phần mã sau đây:

$arr = array(1, 2, 3, 4, 5); 
shuffle($arr); 
var_dump($arr); 

có thể đưa ra kết quả này:

array 
    0 => int 3 
    1 => int 1 
    2 => int 5 
    3 => int 4 
    4 => int 2 

Toàn bộ mảng chính nó được sửa đổi.


Khi được gọi vào một mảng, array_rand lợi nhuận một hoặc nhiều yếu tố từ mảng đó, lựa chọn ngẫu nhiên.

Ví dụ, phần mã sau đây:

$arr = array(1, 2, 3, 4, 5); 
$randomly_selected = array_rand($arr, 3); 
var_dump($randomly_selected); 

có thể đưa ra tis loại đầu ra:

array 
    0 => int 0 
    1 => int 2 
    2 => int 3 

Một phụ mảng của mảng ban đầu được trả lại - và các mảng ban đầu không được sửa đổi.

+3

Lưu ý rằng array_rand trả về các khóa mảng, không phải chính các phần tử. – Asciiom

1

shuffle ảnh hưởng đến các khóa mảng và sử dụng tham số của nó theo tham chiếu. shuffle được sử dụng để yếu về ngẫu nhiên trong các phiên bản cũ hơn của PHP nhưng điều đó không còn đúng nữa.

array_rand để nguyên mảng nguyên bản và có thông số tùy chọn để cho phép bạn chọn số phần tử bạn muốn trả lại.

4

shuffle sắp xếp lại một mảng theo thứ tự ngẫu nhiên. Hàm này lấy một mảng theo tham chiếu, vì nó đang làm biến đổi cấu trúc bên trong của mảng, không chỉ truy cập vào nó, trong khi array_rand đơn giản trả về một chỉ mục ngẫu nhiên trong một mảng.

1

shuffle thay đổi thứ tự của các phần tử của mảng. Đó là một chức năng phân loại.

array_rand trả về n (đối số [1], mặc định là 1) các phần tử ngẫu nhiên từ mảng. Nó trả về một khóa (đối số [1] == 1) hoặc một mảng các khóa (đối số [1]> 1) tham chiếu đến các phần tử của mảng (đối số [0]).

1

Shuffle() lấy toàn bộ mảng và chọn ngẫu nhiên vị trí của các phần tử trong đó. [Lưu ý: Trong các phiên bản trước của PHP, thuật toán shuffle() khá kém]

array_rand() lấy một mảng và trả về một hoặc nhiều mục được chọn ngẫu nhiên. Ưu điểm của array_rand() là nó để nguyên mảng ban đầu.

2

Bằng cách thay đổi thông số $ no Tôi đã thử đoạn mã sau để kiểm tra hiệu suất của cả hai chức năng.Ngay cả trong mảng lớn không có sự khác biệt nhiều. Phần lớn thời gian giữa 1x10 -5 giây và 5x10 -5

$time_start = microtime(true); 
$rand_keys = array_rand($myArray, $no); 
echo (microtime(true)-$time_start)."\n"; 

$time_start = microtime(true); 
shuffle($myArray); 
echo (microtime(true)-$time_start)."\n"; 
Các vấn đề liên quan