数组转换为PHP?


282

将PHP数组转换为字符串的最佳方法是什么?
我有$type一个类型数组的变量。

$type = $_POST[type];

我想将其作为单个字符串存储在数据库中,每个条目之间用分隔|

体育|节日|其他


24
请避免将序列化的值插入数据库。这里的原因:stackoverflow.com/questions/7364803/...
NullUserException

14
@NullUserExceptionఠ_ఠ我同意将序列化的值插入DB绝对会伤人,但您不知道他的情况-也许很必要。
AngryHacker

4
我认为这个问题应该重新讨论。对于初学者来说这是一个有用的问题,我认为这不是题外话。
SaidbakR 2014年

1
如果数组中的某些值有字符怎么办?
2014年

然后,您可以转义那些字符。在这里阅读。php.net/manual/en/regexp.reference.escape.php
FortuneSoldier

Answers:


352

只需使用爆破

implode("|",$type);

13
除非您有嵌套的数组,否则这很好。$_POST如果使用数组命名的表单输入,则可能会发生这种情况。
利斯

与嵌套数组只是使用foreach它会工作。
deepcell

当您获得包含对象的对象数组时,“仅使用foreach”变得相当复杂,但是如果它是简单数据类型的数组,那么这是一个不错的选择。
Melissa Loos

223

您可以使用json_encode()

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

echo json_encode($arr);
?>

稍后,只需使用json_decode()从数据库中解码字符串即可。 其他任何东西都没有用,JSON使数组关系保持完整,以备后用!


40
其他任何东西都没有用 ”……除了可能规范化数据。
丹·拉格

5
Rofl @在我之上发表评论。正如您所说,一揽子声明几乎总是无济于事。
亚伦·科尔

12
我很高兴你们很开心:)
Jakub

16
“笼统的概括以及绝对的观点总是错误的。总是如此。” ;)
Olie 2015年

我喜欢这一把钥匙。这对于以后使用非常有用。
Apolymoxic

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

为什么使用JSON:您可以将其与大多数编程语言一起使用,由php的serialize()函数创建的字符串仅在PHP中可读,并且您不希望将此类内容存储在数据库中,特别是如果数据库在用编写的应用程序之间共享时不同的编程语言


1
在使用JFI时,我不得不调用$ data = json_decode($ jsonString,true)
终端时间

第二个参数是可选的,在大多数情况下,它不需要这样做。
2016年

这对一维或多维数组非常有用,我认为这应该是公认的答案。还可以考虑添加true作为第二个参数。
结合

36

不,您不想那样将其作为单个字符串存储在数据库中。

您可以使用,serialize()但这将使您的数据更难搜索,更难以使用并浪费空间。

您也可以进行其他编码,但是通常容易遇到相同的问题。

您拥有数据库的全部原因是您可以轻松完成这样的工作。您不需要表来存储数组,而需要一个可以表示为数组的表。

例:

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

您只需使用SQL从表中选择数据,而不要使用如下表:

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

这不是任何人在关系数据库中设计模式的方式,它完全违背了它的目的。


2
当然可以,您不必逃脱分隔符!
克里斯·G。

2
@MarcB使得编码不受白痴攻击,是标准的,易于减少错误,并且可以容易地导出回数组。他应该再用一张桌子吗?大概。这比每个人都说的内爆好吗?绝对。
隐身

6
这个问题的正确答案是:不要在RDBMS中插入序列化的值。这是应该召唤猛禽的事情。
NullUserException 2011年

1
@timdev:在某些情况下json-ecaping可能对应于SQL的转义,但最终取决于这样做会烧死您。JSON使用反斜杠-如果您位于无法识别反斜杠并使用双引号进行转义的数据库上,该怎么办?例如''代替\'
Marc B

1
虽然我同意这里表达的原则(正常形式是好的,使用DB来构造是很好的,嗯),但任何以“否,您不想要...”开头的答案都会引起我的注意。你不必提问者的问题的完整的上下文,并相信它或没有,他们可能只是有一个极好的理由进行非规范化这个特定的数据并将其存储在一个单一的领域。不,你不是无所不知;您不知道提问者想要什么。放在一个你的意见的评论,而不是答案,请。
系统暂停

35

最好的方法之一:

echo print_r($array, true);

10
请详细说明您的答案,说明如何解决该问题
我们香蕉中的人2014年

1
您还可以使用:“ print_r($ array,false);”,因为这将在不返回值的情况下打印数组。如果给定true,则print_r()不会自行打印,只会返回字符串。更多信息,请访问:php.net/manual/en/function.print-r.php
Garrett

这是最好的,因为它json_decode弄乱了格式,导致混乱。
Aminah Nuraini


11

这保存了键和值

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

希望它可以帮助某人。



5

对于商店关联数组,您可以使用serialize

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

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

并使用加载unserialize

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

print_r($arr);

但是如果需要创建.php带有数组的动态文件(例如配置文件),则可以使用var_export(..., true);,如下所示:

保存在文件中:

$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);

获取数组值:

$arr = include 'config.php';

print_r($arr);

3

您可以使用PHP字符串函数 implode()

喜欢,

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

例如,如果 $sports='football'; $festival='janmastami'; $food='biriyani';

然后输出将是:

football|janmastami|biriyani

有关PHP implode()函数的更多详细信息,请参考w3schools


0

有很多方法,

两种最佳方法是

$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

您正在重复已经给出的答案。这不会添加新值或新方法。
Tschallacka

@Tschallacka是的,但是这篇文章的答案很少提供输出..
Daud Malik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.