从mysql,我有一个数据BLOB数据类型,它有两种不同的场景(请参见下文)。我试图将它们放入一个字符串中。以下是我正在做的过程:
1。查询:
$names= $results[0]->name;
print_r($names);
第一种情况:
[{"Name":"Mike"},{"Name":"Sean"}]
第二种情况:
{"Name":"Mike Smith","Spaces":"1"}
2。 JSON_DECODE
$data = json_decode(stripslashes($names),true);
print_r($data);
第一种情况:
Array
(
[0] => Array
(
[Name] => Mike
)
[1] => Array
(
[Name] => Smith
)
)
第二种情况:
Array
(
[Name] => Mike Smith
[Spaces] => 1
)
第3。我要做的是:将它们放入一个字符串
$string = '';
for ($i=0; $i <sizeof($data) ; $i++){
$row = $data[$i];
$name = $row -> Name;
if(isset($row -> Spaces)){
$number = '(' . $row -> Spaces . ')';
}else{
$number = '';
};
$string .= $name . $number . ', ';
};
//Remove last comma
$refined = rtrim($string,', ');
print_r($refined);
4。 ISSUE
我遇到的问题是,因为数据可能有两种不同的情况,如&#34; 1.Query&#34;中所示,我无法预测或推广它并得到像#34这样的错误;试图获得非对象的属性&#34;。
我该如何解决这个问题?
答案 0 :(得分:1)
由于您正在传递true
to the $assoc
parameter of json_decode
,$row->Name
永远不会成为正确的语法,因为您有一个数组,并且这是访问对象的语法;你想要$row['Name']
。 (顺便说一下,在->
周围放置空间是不常见的。)
但是,你在这一行基本上有正确的想法:
if(isset($row -> Spaces)){
对于数组,而不是:
if(isset($row['Spaces'])){
你可以做同样的事情,看看你是否有名字或名单:
if(isset($row['Name'])) {
// In scenario B
echo $row['Name'];
// check for 'Spaces' etc
} else {
// In scenario A
foreach ( $row as $item ) {
echo $item['Name'];
}
}
请注意我在这里使用a foreach
loop,这比你的for
循环更适合这类事情。
答案 1 :(得分:1)
我会编辑我的答案以便更好地理解
$str1 = '[{"Name":"Mike"},{"Name":"Sean"}]';
$str2 = '{"Name":"Mike Smith","Spaces":"1"}';
$json1 = json_decode($str1, false);
$json2 = json_decode($str2, false);
if(is_object($json1))
{ echo 'json1 is object<br>'; } else
{ echo 'json1 is NOT object<br>'; }
if(is_object($json2))
{ echo 'json2 is object'; } else
{ echo 'json2 is NOT object'; }