如何在PHP中将数组元素转换为字符串?

94
如果我有一个包含对象的数组:
$a = array($objA, $objB);

(每个对象都有一个__toString()方法)

我该如何将数组中的所有元素转换为字符串,使得数组$a不再包含对象而是它们的字符串表示?是否有一种一行代码的解决方案,还是我必须手动遍历数组?


你看过 http://php.net/array_map 吗? - Kemo
请参考 - https://dev59.com/aGnWa4cB1Zd3GeqPwxWE#42998701 - Rohit Suthar
@RohitSuthar:你的链接答案将一个字符串转换为数组。这个问题是关于将对象数组转换为它们的字符串表示形式的数组。 - acme
如果您想进行调试,您可能想要查看https://dev59.com/enVC5IYBdhLWcg3w9F89 - Kosmas
7个回答

227
一个简短的语句:
$a = array_map('strval', $a);
// strval is a callback function

请看PHP文档:

array_map

strval


1
如果您不想将函数'strval'作为字符串引用,也可以像这样调用:return array_map(fn ($item) => strval($item), $items); - Tasik

3
阿里克斯·阿克塞尔(Alix Axel)的回答很好。您还可以使用array_map将任何内容应用于数组,例如...
//All your objects to string.
$a = array_map(function($o){return (string)$o;}, $a);
//All your objects to string with exclamation marks!!!
$a = array_map(function($o){return (string)$o."!!!";}, $a);

欢迎


2
你正在寻找 implode 函数吗?
$array = array('lastname', 'email', 'phone');

$comma_separated = implode(",", $array);

echo $comma_separated; // lastname,email,phone

1
不行,因为我的数组由对象组成,而不是字符串。结果应该是一个数组,而不是合并后的字符串。 - acme

2
未经测试,但类似这样的东西应该可以做到吧?
foreach($a as $key => $value) {
    $new_arr[$key]=$value->__toString();
}
$a=$new_arr;

请阅读问题,它说“是否有一行代码或者我必须手动循环…” :) - Kemo
1
是的,正如我在Alix的帖子评论中建议的那样,如果我知道他的解决方案,我会提供它。 - Ben Everard

-2
$str1 = "pankaj";
$str2 = array("sam",'pankaj',"hello");
function Search($x ,$y){
    $search = $x;
    $arr = $y;
 foreach($y as $key => $value){
    $str = array_search($x, $y);
    if($str == $key){
    echo $key ."=>".$value;
    echo "<br>".gettype($value);
  }
 }
}
Search($str1 ,$str2);

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

-2

我现在无法测试,但你能否检查当你implode()这样的数组时会发生什么?_toString应该被调用。


可以的。简单的 implode($array) 就可以了。 - Gordon
2
@Gordon:它将把所有字符串合并为一个,我认为 OP 希望保留 __toString() 生成的字符串在相应的数组元素中。 - Alix Axel
好的,我希望数组仍然保持完整,只需要其中的元素转换为字符串。 - acme
@Alix 哦,我明白了。是的。那么 implode 不行。 - Gordon
explode(',', implode(',' $array)) 然后呢?虽然提出的 array_map 更加优雅,但这种方法 可能 可以像这样完成,不是吗? - nikc.org
1
@nikc:如果生成的 __toString() 包含 ,,那就不行。 - Alix Axel

-6

你为什么不能这样做呢?

$a = array(
    (string) $objA,
    (string) $objB,
);

是的,因为实际上我不知道数组中有多少个元素。上面的示例只是缩减为两个元素,以使其更清晰。 - acme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接