如何在json decode时,检索 name 项不重复?然后输出整项的 name 和 id 的值。JSON树,保存在外部文件里,结构。
[
{"name":"wang","id":"101"},
{"name":"zhao","id":"201"},
{"name":"zhang","id":"103"},
{"name":"xu","id":"106"},
{"name":"zhou","id":"107"},
{"name":"wang","id":"18"}, //wang已经有过,不输出
{"name":"xu","id":"92"}, //xu已经出现过,跳过输出
{"name":"yi","id":"15"}
]
PHP代码
// 一些 curl 分析上面JSON树文件的代码
$json = json_decode($body, true);
foreach ($json['data'] as $data) {
  echo $data['name'].'<br />';
  echo $data['id'].'<br />';
}
考虑过用 array_unique 函数,$names = Array();
foreach ($json['data'] as $data) {
   $names[] = $data['name'];
   //$id[] = $data['id'];  
}
$names = array_unique($names);  // id封装在 array_unique,检索不出重复项了
foreach ($names as $name) {
   echo $name; // 可以输出所有不重复的 name 值
   // echo $id;   // $id  没有被封装到 新的foreach里 被无视了
   // echo $data['id'];    //$data['id']是上一个foreach的产物,永远只输出上一个foreach的最后一项值
}看来简单的 array_unique 函数不能解决问题,求助大家。
是否把 array_unique 封装到 class 或者function 里使用? 或者用别的缓存数组方法,可以实现我的要求? 
求可行的代码。谢谢大家。

解决方案 »

  1.   

    本帖最后由 xuzuning 于 2011-06-13 15:45:50 编辑
      

  2.   

    $arr = array(
    array('name' => 'a', 'id' => 1),
    array('name' => 'a', 'id' => 2),
    array('name' => 'c', 'id' => 3),
    array('name' => 'c', 'id' => 4),
    array('name' => 'e', 'id' => 5),
    array('name' => 'f', 'id' => 6),
    );$json = json_encode($arr);function decode_json($json, $assoc = true){
    if(!$json){
    return null;
    }
    $decode = json_decode($json, $assoc);
    $return = array();
    foreach($decode as $val){
    $return[$val['name']] = $val;
    }
    return $return;
    }echo '<pre>';print_r(decode_json($json));
      

  3.   

    $arr = array(
    array('name' => 'a', 'id' => 1),
    array('name' => 'a', 'id' => 2),
    array('name' => 'c', 'id' => 3),
    array('name' => 'c', 'id' => 4),
    array('name' => 'e', 'id' => 5),
    array('name' => 'f', 'id' => 6),
    );$json = json_encode($arr);function decode_json($json, $assoc = false){
    if(!$json){
    return null;
    }
    $decode = json_decode($json, $assoc);
    $return = array();
    foreach($decode as $val){
    if(is_object($val)){
    settype($val, 'array');
    }
    $return[$val['name']] = $val;
    }
    unset($decode);
    return $return;
    }echo '<pre>';print_r(decode_json($json));
      

  4.   

    kyzy_yy_pm,一定要变成array才可以吗?你的方法输出为空。
    <?php
    $json = <<<EOT
    [
        {
            "name": "wang",
            "id": "101"
        },
        {
            "name": "zhao",
            "id": "201"
        },
        {
            "name": "zhang",
            "id": "103"
        },
        {
            "name": "xu",
            "id": "106"
        },
        {
            "name": "zhou",
            "id": "107"
        },
        {
            "name": "wang",
            "id": "18"
        },
        {
            "name": "xu",
            "id": "92"
        },
        {
            "name": "yi",
            "id": "15"
        }
    ]
    EOT;function decode_json($json, $assoc = false){
        if(!$json){
            return null;
        }
        $decode = json_decode($json, $assoc);
        $return    = array();
        foreach($decode as $val){
            if(is_object($val)){
                settype($val, 'array');
            }
            $return[$val['name']] = $val;
        }
        unset($decode);
        return $return;
    }echo '<pre>';print_r(decode_json($json));
    ?>
      

  5.   

    xuzuning, 你的方法还是会输出全部记录,并没有过滤掉重复名字的记录
    <?php
    $body = <<<EOT
    [
        {
            "name": "wang",
            "id": "101"
        },
        {
            "name": "zhao",
            "id": "201"
        },
        {
            "name": "zhang",
            "id": "103"
        },
        {
            "name": "xu",
            "id": "106"
        },
        {
            "name": "zhou",
            "id": "107"
        },
        {
            "name": "wang",
            "id": "18"
        },
        {
            "name": "xu",
            "id": "92"
        },
        {
            "name": "yi",
            "id": "15"
        }
    ]
    EOT;
    $json = json_decode($body, true);
    $dict = array();
    foreach ($json as $data) {
      if(! in_array($name, $dict)) {
    $dict[] = $data['name'];
        echo $data['name'].'<br />';
        echo $data['id'].'<br />';
      }
    }?>
      

  6.   

    怎么回事空呢,没有空的理由啊
    /*
    输出:Array
    (
        [a] => Array
            (
                [name] => a
                [id] => 2
            )    [c] => Array
            (
                [name] => c
                [id] => 4
            )    [e] => Array
            (
                [name] => e
                [id] => 5
            )    [f] => Array
            (
                [name] => f
                [id] => 6
            ))
    */
      

  7.   

    我这输出
    $json = <<<json
    [
        {
            "name": "wang",
            "id": "101"
        },
        {
            "name": "zhao",
            "id": "201"
        },
        {
            "name": "zhang",
            "id": "103"
        },
        {
            "name": "xu",
            "id": "106"
        },
        {
            "name": "zhou",
            "id": "107"
        },
        {
            "name": "wang",
            "id": "18"
        },
        {
            "name": "xu",
            "id": "92"
        },
        {
            "name": "yi",
            "id": "15"
        }
    ]
    json;function decode_json($json, $assoc = false){
        if(!$json){
            return null;
        }
        $decode = json_decode($json, $assoc);
        $return    = array();
        foreach($decode as $val){
            if(is_object($val)){
                settype($val, 'array');
            }
            $return[$val['name']] = $val;
        }
        unset($decode);
        return $return;
    }echo '<pre>';print_r(decode_json($json));//输出结果:
    Array
    (
        [wang] => Array
            (
                [name] => wang
                [id] => 18
            )    [zhao] => Array
            (
                [name] => zhao
                [id] => 201
            )    [zhang] => Array
            (
                [name] => zhang
                [id] => 103
            )    [xu] => Array
            (
                [name] => xu
                [id] => 92
            )    [zhou] => Array
            (
                [name] => zhou
                [id] => 107
            )    [yi] => Array
            (
                [name] => yi
                [id] => 15
            ))
      

  8.   

    $json = json_decode($body, true);
    $dict = array();
    foreach ($json as $data) {
      if(! in_array($data['name'], $dict)) {
        echo $data['name'].'<br />';
        echo $data['id'].'<br />';
        $dict[] = $data['name'];
      }
    }