递归JSON转换

时间:2013-10-09 01:55:24

标签: php arrays json recursion

假设我有一个JSON字符串:

$json = '{"lemon":"test",
          "orange":["toto", "tata", "tete"],
          "zob":[{"id":"0"}, {"id":"1"}]}';

我想循环遍历该编码对象以修改其中的每个字符串,因此我有一个递归函数:

function doObject($__obj){
  $__obj = cycleObject($__obj);
  return $__obj;
}

function cycleObject($__obj){
  $type = gettype($__obj);
  foreach($__obj as $var => &$val){
    switch(gettype($val)){
      case 'object':
      cycleObject($val);
      break;

      case 'array':
      cycleObject($val);
      break;

      case 'string':
      if($type == 'object'){
        $__obj->$var = $val.'-ok';
      }else{
        if($type == 'array'){
          $__obj[$var] = $val.'-ok';
        }
      }
      break;
    }
  }
  return $__obj;
}

我称之为功能:

$obj = doObject(json_decode($json));
var_dump($obj);

给出了:

object(stdClass)#1 (3) {
    ["lemon"]=> string(7) "test-ok"
    ["orange"]=> array(3) {
        [0]=> string(4) "toto"
        [1]=> string(4) "tata"
        [2]=> string(4) "tete" }
    ["zob"]=> array(2) {
        [0]=> object(stdClass)#2 (1) {
            ["id"]=> string(4) "0-ok" }
        [1]=> object(stdClass)#3 (1) {
            ["id"]=> string(4) "1-ok" }
    }
}

现在我的问题是,由于某种原因,我无法直接修改由字符串组成的数组,或者我应该说,修改后的字符串在数组内(而不是在数组内的对象内)因为数组丢失它的参考。我如何在orange中解决这个问题,而不是获得:

[0]=> string(7) "toto-ok"
[1]=> string(7) "tata-ok"
[2]=> string(7) "tete-ok"

1 个答案:

答案 0 :(得分:1)

您的函数未正确检查您的字符串数组。基本上,在每个数组中,您需要进行第二次检查以查看是否正在处理另一个数组/对象或字符串,否则会绕过常规的字符串数组....奇怪的是。以下内容适用于您:

$json = '{"lemon":"test", 
          "orange":["toto", "tata", "tete"], 
          "zob":[{"id":"0"}, {"id":"1"}]}';

function doObject($__obj){      
    $__obj = cycleObject($__obj);       
    return $__obj;  
}

function cycleObject($__obj){   
    foreach($__obj as $key => &$val){  
        if(is_object($val)) {
            cycleObject($val);
        }
        if(is_array($val)) {
            foreach($val as &$v) {
                if(is_object($v) || is_array($v)) {
                    cycleObject($v);
                } else {
                    $v .= '-ok';
                }
            }
        }
        if(is_string($val)) {
            $val .= '-ok';
        }
    }   
    return $__obj;
}

$obj = doObject(json_decode($json));
var_dump($obj);

这产生了您在我当地环境中寻找的结果。

object(stdClass)#1 (3) {
  ["lemon"]=>
  string(7) "test-ok"
  ["orange"]=>
  array(3) {
    [0]=>
    string(7) "toto-ok"
    [1]=>
    string(7) "tata-ok"
    [2]=>
    string(7) "tete-ok"
  }
  ["zob"]=>
  array(2) {
    [0]=>
    object(stdClass)#2 (1) {
      ["id"]=>
      string(4) "0-ok"
    }
    [1]=>
    object(stdClass)#3 (1) {
      ["id"]=>
      string(4) "1-ok"
    }
  }
}