2010-04-18 63 views
44

Tôi chỉ muốn lưu trữ nhanh chóng một mảng mà tôi nhận được từ một API từ xa, để tôi có thể gây rối với nó trên một máy chủ cục bộ.Làm cách nào để lưu trữ một mảng trong một tệp để truy cập dưới dạng mảng sau với PHP?

Vì vậy:

  1. Tôi hiện đang có một mảng.
  2. Tôi muốn mọi người sử dụng mảng mà không cần phải lấy nó từ API.

Hiện tại không có nhu cầu cho hiệu quả vv đây, isnt này cho một trang web thực tế chỉ để nhận một số phương pháp khử trùng/định dạng làm vv

Có một chức năng như store_array() hoặc restore_arrray()?!

+3

chính bettwen JSON và chức năng serialize nhị phân được đề cập ở đây - http://stackoverflow.com/questions/804045/preferred-method-to- store-php-array-json-mã hóa-vs-serialize/804089 # 804089. – retro

Trả lời

63

Cách tốt nhất để làm điều này là tuần tự hóa JSON. Đó là con người có thể đọc được và bạn sẽ nhận được hiệu suất tốt hơn (tập tin nhỏ hơn và nhanh hơn để tải/lưu). Mã này rất dễ. Chỉ cần hai chức năng

Ví dụ mã:

$arr1 = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); 
file_put_contents("array.json",json_encode($arr1)); 
# array.json => {"a":1,"b":2,"c":3,"d":4,"e":5} 
$arr2 = json_decode(file_get_contents('array.json'), true); 
$arr1 === $arr2 # => true 

Bạn có thể viết store_array và restore_array chức năng của riêng bạn một cách dễ dàng với ví dụ này.

Để so sánh tốc độ, hãy xem benchmark ban đầu từ Preferred method to store PHP arrays (json_encode vs serialize).

+2

mã của bạn sai. bạn sẽ không lấy một mảng với mã của bạn. –

+1

Có loại không phù hợp trên dòng thứ hai. Nên có $ arr1. Ngoài ra, bạn cần chuyển giá trị true thành tham số thứ hai thành json_decode để trả về mảng. Mã được cập nhật. – retro

+1

nếu mảng là trung bình (500-2000 mục), thì 'serialize' và' unserialize' thực sự nhanh hơn rất nhiều. – Adam

29

Nếu bạn không cần tệp kết xuất để có thể đọc được, bạn chỉ có thể serialize() mảng.

lưu trữ:

file_put_contents('yourfile.bin', serialize($array)); 

nhặt đồ:

$array = unserialize(file_get_contents('yourfile.bin')); 
+0

Tiện ích có phải là thùng rác không? –

+0

Bất kỳ phần mở rộng nào là tốt – mt025

+0

Ví dụ này có vẻ an toàn. Nhưng đôi khi việc gọi unserialize trên đầu vào của người dùng có thể nguy hiểm vì nó cho phép kẻ tấn công xác định bất kỳ biến nào với một giá trị tùy ý. –

1

serialze Sử dụng php của:

file_put_contents("myFile",serialize($myArray)); 
+1

Vì có "không cần hiệu quả", đây là lựa chọn cuối cùng tôi muốn giới thiệu. Nó có thể dễ dàng để mã hóa một giải pháp với serialize/unserialize, nhưng mảng không phải là trong một định dạng rất dễ đọc/có thể chỉnh sửa nếu mọi người thực sự muốn xem hoặc sửa đổi các tập tin được lưu trữ. Hơn nữa, nếu được lưu trữ trong một kho lưu trữ, tất cả dữ liệu nằm trên một dòng, vì vậy những thay đổi nhỏ đối với các mảng lớn hơn là rất khó nhìn thấy. –

7

Bạn có thể sử dụng serialize để làm cho nó thành một chuỗi ghi ra tập tin, và kèm theo unserialize để trả về cấu trúc mảng.

Tôi khuyên bạn nên sử dụng cấu trúc độc lập về ngôn ngữ, chẳng hạn như JSON. Điều này sẽ cho phép bạn tải các tệp bằng các ngôn ngữ khác với PHP, trong trường hợp có khả năng sau này. json_encode để lưu trữ và json_decode($str, true) để trả lại.

20

Sử dụng serializeunserialize

// storing 
$file = '/tmp/out.data'; 
file_put_contents($file, serialize($mydata)); // $mydata is the response from your remote API 

// retreiving 
$var = unserialize(file_get_contents($file)); 

Hoặc khác, cách hacky:

var_export() thực hiện chính xác những gì bạn muốn, nó sẽ mất bất kỳ loại biến, và lưu nó trong một đại diện cho các phân tích cú pháp PHP có thể đọc lại. Bạn có thể kết hợp nó với file_put_contents để lưu trữ trên đĩa và sử dụng file_get_contentseval để đọc lại.

// storing 
$file = '/tmp/out.php'; 
file_put_contents($file, var_export($var, true)); 

// retrieving 
eval('$myvar = ' . file_get_contents($file) . ';'); 
+0

Làm thế nào bạn có thể tải lại đầu ra var_export() đó? Với eval()? Hãy thử var_export một số Object. – retro

+0

Hoặc bằng eval hoặc chỉ cần bao gồm() tệp. –

+0

Hm, tôi thực sự không thấy trong bối cảnh nào 'include' sẽ làm việc một mình: Tôi đã cố gắng một lúc và thất bại, cho đến khi tôi tìm thấy http://stackoverflow.com/questions/933506/how-to-read-output -of-var-export-in-a-biến-in-php - xác nhận 'eval' nên được sử dụng để đọc lại dữ liệu' var_export'ed. – sdaau

0

Một cách nhanh chóng không được đề cập ở đây:

Bằng cách đó thêm tiêu đề với <?php thẻ bắt đầu, tên của biến \$my_array = với thoát \$ và footer ?> thẻ kết thúc.

Bây giờ, bạn có thể sử dụng include() giống như bất kỳ tập lệnh php hợp lệ nào khác.

// storing 
$file = '/tmp/out.php'; 
file_put_contents($file, "<?php\n\$my_array = ".var_export($var, true).";\n?>"); 

// retrieving as included script 
include($file); 

//testing 
print_r($my_array); 

out.php sẽ trông như thế này

khác biệt
<?php 
    $my_array = array (
    'a'=>1, 
    'b'=>2, 
    'c'=>3, 
    'd'=>4, 
    'e'=>5 
); 
?> 
Các vấn đề liên quan