Mảng để chuỗi PHP?


282

Phương pháp tốt nhất để chuyển đổi một mảng PHP thành một chuỗi là gì?
Tôi có một biến $typelà một mảng các loại.

$type = $_POST[type];

Tôi muốn lưu trữ nó dưới dạng một chuỗi trong cơ sở dữ liệu của mình với mỗi mục được phân tách bằng |:

Thể thao | Lễ hội | Khác


24
Vui lòng không chèn các giá trị nối tiếp vào cơ sở dữ liệu. Đây là lý do: stackoverflow.com/questions/7364804/ Lời
NullUserException

14
@NullUserException _ఠ Tôi đồng ý rằng việc chèn các giá trị nối tiếp vào DB hoàn toàn làm bỏng mắt, nhưng bạn không biết tình huống của anh ta - điều đó rất có thể được bảo đảm.
AngryHacker

4
Tôi nghĩ rằng câu hỏi này nên được mở lại. Đó là câu hỏi hữu ích cho người mới bắt đầu và tôi không nghĩ nó lạc đề.
SaidbakR

1
Điều gì xảy ra nếu một số giá trị trong mảng có ký tự |
sumit

Sau đó bạn có thể thoát khỏi những nhân vật đó. Đọc nó ở đây. php.net/manual/en/regexp.reference.escape.php
FortuneSoldier

Câu trả lời:


352

Đơn giản chỉ cần sử dụng implode

implode("|",$type);

13
Điều này là tốt trừ khi bạn có các mảng lồng nhau - điều này có thể xảy ra $_POSTnếu bạn đang sử dụng các đầu vào dạng có tên mảng.
Leith

với các mảng lồng nhau, chỉ cần sử dụng một foreach nó sẽ hoạt động.
Deepcell

224

Bạn có thể sử dụng json_encode ()

<?php
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);

echo json_encode($arr);
?>

Sau đó, chỉ cần sử dụng json_decode () để giải mã chuỗi từ DB của bạn. Bất cứ điều gì khác là vô ích, JSON giữ nguyên mối quan hệ mảng để sử dụng sau này!


40
" Bất cứ điều gì khác là vô ích " ... ngoại trừ có lẽ bình thường hóa dữ liệu.
Dan Lugg

5
Rofl @ bình luận ở trên tôi. Như bạn nói, tuyên bố chăn hầu như luôn luôn, không có ích.
Aaron Cole

12
Tôi rất vui vì các bạn được giải trí :)
Jakub

16
"Quét khái quát, cũng như tuyệt đối, luôn luôn sai. Luôn luôn." ;)
Olie

Tôi thích cái này giữ chìa khóa. Điều này rất hữu ích để sử dụng sau này.
Apolymoxic

45
json_encode($data) //converts an array to JSON string
json_decode($jsonString) //converts json string to php array

TẠI SAO JSON: Bạn có thể sử dụng nó với hầu hết các ngôn ngữ lập trình, chuỗi được tạo bởi hàm serialize () của php chỉ có thể đọc được bằng PHP và bạn sẽ không muốn lưu trữ những thứ đó trong cơ sở dữ liệu của mình đặc biệt nếu cơ sở dữ liệu được chia sẻ giữa các ứng dụng được viết trong ngôn ngữ lập trình khác nhau


1
JFI sử dụng tôi đã phải gọi $ data = json_decode ($ jsonString, true)
Terminality

đối số thứ hai là tùy chọn, trong hầu hết các trường hợp, nó hoạt động mà không có điều đó.
Djuzz

Điều này làm việc cho các mảng đơn hoặc đa chiều xuất sắc và theo tôi đây nên là câu trả lời được chấp nhận. Cũng xem xét thêm true như một tham số thứ hai.
Kết hợp

36

Không, bạn không muốn lưu trữ nó dưới dạng một chuỗi trong cơ sở dữ liệu của bạn như thế.

Bạn có thể sử dụng serialize()nhưng điều này sẽ làm cho dữ liệu của bạn khó tìm kiếm hơn, khó làm việc hơn và lãng phí không gian.

Bạn cũng có thể thực hiện một số mã hóa khác, nhưng nó thường dễ gặp vấn đề tương tự.

Toàn bộ lý do bạn có DB là để bạn có thể hoàn thành công việc như thế này một cách tầm thường. Bạn không cần một bảng để lưu trữ các mảng, bạn cần một bảng mà bạn có thể biểu diễn dưới dạng một mảng.

Thí dụ:

id | word
1  | Sports
2  | Festivals
3  | Classes
4  | Other

Bạn chỉ cần chọn dữ liệu từ bảng bằng SQL, thay vì có một bảng trông như sau:

id | word
1  | Sports|Festivals|Classes|Other

Đó không phải là cách bất cứ ai thiết kế một lược đồ trong cơ sở dữ liệu quan hệ, nó hoàn toàn đánh bại mục đích của nó.


2
chắc chắn là như vậy, bạn không cần phải thoát khỏi các dấu phân cách!
Chris G.

2
@MarcB Nó làm cho mã hóa không bị lỗi, chuẩn, dễ bị lỗi hơn và dễ dàng xuất trở lại thành một mảng. Có nên dùng bàn khác không? Có lẽ. Đây có phải là tốt hơn so với tất cả mọi người nói nổ? Chắc chắn rồi.
Ẩn danh

6
Câu trả lời đúng cho câu hỏi này sẽ là: không chèn các giá trị được tuần tự hóa vào RDBMS. Đây là loại điều nên triệu tập raptors .
NullUserException

1
@timdev: thoát json có thể trong một số trường hợp tương ứng với thoát SQL, nhưng tùy thuộc vào điều đó sẽ chỉ đốt cháy bạn cuối cùng. JSON sử dụng dấu gạch chéo ngược - điều gì xảy ra nếu bạn trên DB không nhận ra dấu gạch chéo ngược và sử dụng dấu ngoặc kép để thoát? ví dụ ''thay vì \'?
Marc B

1
Mặc dù tôi đồng ý với nguyên tắc được trình bày ở đây (các hình thức bình thường là tốt, sử dụng DB để cấu trúc là tốt, duh), bất kỳ câu trả lời nào bắt đầu bằng "Không, bạn không muốn ..." đặt chuông trong đầu tôi. Bạn không có ngữ cảnh đầy đủ của câu hỏi của người hỏi và tin hay không, họ có thể có một lý do tuyệt vời để không chuẩn hóa dữ liệu cụ thể này và lưu trữ nó trong một trường duy nhất. Không, bạn không phải là người toàn diện; bạn KHÔNG biết người hỏi muốn gì. Đặt ý kiến ​​của bạn trong một bình luận , không phải là một câu trả lời , xin vui lòng.
hệ thống PAUSE

35

Một trong những cách tốt nhất:

echo print_r($array, true);

10
vui lòng giải thích câu trả lời của bạn, cho thấy cách giải quyết vấn đề
Người đàn ông của chúng tôi ở Chuối

1
Bạn cũng có thể sử dụng: "print_r ($ mảng, false);", vì điều này sẽ in mảng mà không trả về giá trị. Nếu đúng là được đưa ra, print_r () sẽ không tự in và sẽ trả về chuỗi. Xem thêm tại: php.net/manual/en/feft.print-r.php
Garrett

Cái này nên là cái tốt nhất vì nó json_decodelàm rối định dạng gây nhầm lẫn.
Aminah Nuraini

14

mã hóa () :

<?php
$string = implode('|',$types);

Tuy nhiên, Ẩn danh là đúng, có lẽ bạn không muốn lưu trữ theo cách đó - đó là một sự lãng phí hoàn toàn sức mạnh quan hệ của cơ sở dữ liệu của bạn.

Nếu bạn đã chết trong việc tuần tự hóa, bạn cũng có thể cân nhắc sử dụng json_encode ()


implode được giới hạn mảng phẳng
ahnbizcad

11

Điều này giúp tiết kiệm chìa khóa và giá trị

function array2string($data){
    $log_a = "";
    foreach ($data as $key => $value) {
        if(is_array($value))    $log_a .= "[".$key."] => (". array2string($value). ") \n";
        else                    $log_a .= "[".$key."] => ".$value."\n";
    }
    return $log_a;
}

Hy vọng nó sẽ giúp được ai đó.


6
$data = array("asdcasdc","35353","asdca353sdc","sadcasdc","sadcasdc","asdcsdcsad");

$string_array = json_encode($data);

bây giờ bạn có thể chèn giá trị $ string_array này vào Cơ sở dữ liệu


5

Đối với mảng kết hợp cửa hàng, bạn có thể sử dụng serialize:

$arr = array(
    'a' => 1,
    'b' => 2,
    'c' => 3
);

file_put_contents('stored-array.txt', serialize($arr));

Và tải bằng cách sử dụng unserialize:

$arr = unserialize(file_get_contents('stored-array.txt'));

print_r($arr);

Nhưng nếu cần tạo .phpcác tệp dinamic có mảng (ví dụ: tệp cấu hình), bạn có thể sử dụng var_export(..., true);, như thế này:

Lưu trong tập tin:

$arr = array(
    'a' => 1,
    'b' => 2,
    'c' => 3
);

$str = preg_replace('#,(\s+|)\)#', '$1)', var_export($arr, true));
$str = '<?php' . PHP_EOL . 'return ' . $str . ';';

file_put_contents('config.php', $str);

Nhận giá trị mảng:

$arr = include 'config.php';

print_r($arr);

3

Bạn có thể sử dụng hàm chuỗi PHP implode()

Giống,

<?php
  $sports=$_POST['sports'];;
  $festival=$_POST['festival'];
  $food=$_POST['food'];
  $array=[$sports,$festival,$food];
  $string=implode('|',$array);
  echo $string;
?>

Nếu, ví dụ, $sports='football'; $festival='janmastami'; $food='biriyani';

Sau đó, đầu ra sẽ là:

football|janmastami|biriyani

Để biết thêm chi tiết về hàm implode () của PHP, hãy tham khảo w3schools


0

có rất nhiều cách ,

hai cách tốt nhất cho việc này là

$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);
//ouputs as
{"a":1,"b":2,"c":3,"d":4,"e":5}


$b = array ('m' => 'monkey', 'foo' => 'bar', 'x' => array ('x', 'y', 'z'));
$results = print_r($b, true); // $results now contains output from print_r

Bạn đang lặp lại câu trả lời đã được đưa ra. Điều này không thêm giá trị mới hoặc phương pháp mới.
Tschallacka

@Tschallacka yeah nhưng rất ít câu trả lời trên bài đăng này cung cấp đầu ra ....
Daud Malik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.