2017-06-06 80 views
0

从mysql中,我有一个数据BLOB数据类型,它有两种不同的方案(请参见下文)。我试图把它们放入一个字符串中。下面是我在做的过程:不同数据长度的php JSON_DECODE

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

我遇到的问题是,因为数据可能有两个不同的情况,如“1.Query”中所示,我无法预测或概括它,并得到像“试图获得非对象的财产“。

我该如何解决这个问题?

+2

你引用的数组,如果它是一个对象。使用'$'['Spaces']'和'$ row ['Name']' – RiggsFolly

+0

使用'isset('Spaces')'来预测它们是**第二种情况** –

+0

或者从''json_decode()'并将数据保留为对象 – RiggsFolly

回答

1

既然你传递trueto 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循环更适合这种事情。

+0

或者只是从'json_decode() '并将数据保留为对象 – RiggsFolly

+0

@RiggsFolly当然,您可以删除该数据,但仍需要进行isset检查以确定您处于哪种情况,这是真正的问题。就个人而言,我更喜欢关联数组; 'stdClass'很奇怪。 – IMSoP

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

http://php.net/manual/en/function.is-object.php

+0

尝试添加一些格式和说明文字到您的答案! – Zimano