【问题标题】:How to remove duplicate values from Json in PHP如何在 PHP 中从 Json 中删除重复值
【发布时间】:2020-06-20 01:31:00
【问题描述】:

如何使用 PHP 从 JSON 中删除重复项?

<?php
if(!function_exists("curl_init")) die("cURL extension is not installed");
$json = 'https://sug.daraz.pk/sug?area=lazada_pk_web&code=utf-8&q=book';

$ch=curl_init($json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$r=curl_exec($ch);
curl_close($ch);

$arr = json_decode($r,true);

foreach($arr['result'] as $item) {

    foreach ($item["model"] as $key => $value) {
        $pattern = '/\s+/';
        $string = $value.' ';

        $split = preg_split( $pattern, $string);
        $go = implode(', ', $split);

        echo $go;
        }
}
?>

我得到结果:

books, book, shelf, book, rack, bookmarks, books, for, kids, book, holder, book, shelve, book, stand, book, end, book, reader, 

我希望结果是这样的文本:

books, book, shelf, rack, bookmarks, for, kids, holder, shelve, stand, end, reader, 

【问题讨论】:

    标签: php arrays json duplicates unique


    【解决方案1】:

    我正在使用array_uniquearray_merge

    if(!function_exists("curl_init")) die("cURL extension is not installed");
    $json = 'https://sug.daraz.pk/sug?area=lazada_pk_web&code=utf-8&q=book';
    
    $ch=curl_init($json);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $r=curl_exec($ch);
    curl_close($ch);
    
    $arr = json_decode($r,true);
    $result = array();
    
    foreach($arr['result'] as $item) {
    
        foreach ($item["model"] as $key => $value) {
            $pattern = '/\s+/';
            $string = $value.' ';
    
            $split = preg_split( $pattern, $string);
            $result = array_merge($result, $split);
        }
    }
    $result = array_values(array_filter(array_unique($result), function($value) { return !is_null($value) && $value !== ''; }));
    print implode(', ', $result);
    
    

    按预期输出:

    books, book, shelf, rack, bookmarks, for, kids, holder, shelve, stand, end, reader
    

    【讨论】:

    • 天啊..好主意,...谢谢...:D
    • 我统计了使用的四种数组方法,一种在嵌套的foreach() 中,其中有两种。这段代码四处游荡,试图完成一个简化的结果。为什么不直接使用array_reduce()
    • 你可能错过了我的意思。看看我提供的答案;这个答案中的过程比仅仅根据存在性检查将源数组减少到一个集合中效率低得多。
    • @JaredFarrish 知道了@lyndra 你可以array_reduce 以及查看 JaredFarrish 的回答者
    • @JaredFarrish 我不明白 :( 你能举个例子吗?
    【解决方案2】:

    满足您需求的最佳做法是创建一个新的Array 并使用条件将您的密钥推入其中,以使用in_array 函数检查它们是否尚未进入数组。

    例如:

    <?php
    if(!function_exists("curl_init")) die("cURL extension is not installed");
    $json = 'https://sug.daraz.pk/sug?area=lazada_pk_web&code=utf-8&q=book';
    
    $ch=curl_init($json);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $r=curl_exec($ch);
    curl_close($ch);
    
    $arr = json_decode($r, true);
    $data = array();
    
    foreach($arr['result'] as $item) {
        foreach ($item["model"] as $key => $value) {
            $pattern = '/\s+/';
            $string = $value.' ';
    
            $split = preg_split( $pattern, $string);
            $go = implode(', ', $split);
    
            if (!in_array($go, $data)) {
                array_push($data, $go);
            }
        }
    }
    
    echo implode(',', $data);
    

    【讨论】:

      【解决方案3】:

      这是一个相当标准的 reduce 函数。请注意最后传递的数组,并且我会分解搜索词。

      $data = json_decode('{"result":[{"type":"nt-common","model":{"query":"books"}},{"type":"nt-common","model":{"query":"book shelf"}},{"type":"nt-common","model":{"query":"book rack"}},{"type":"nt-common","model":{"query":"bookmarks"}},{"type":"nt-common","model":{"query":"books for kids"}},{"type":"nt-common","model":{"query":"book holder"}},{"type":"nt-common","model":{"query":"book shelve"}},{"type":"nt-common","model":{"query":"book stand"}},{"type":"nt-common","model":{"query":"book end"}},{"type":"nt-common","model":{"query":"book reader"}}]}');
      
      $queries = array_reduce($data->result, static function($found, $result) {
          $items = explode(' ', $result->model->query);
      
          foreach($items as $item) {
              if (!in_array($item, $found)) {
                  $found[] = $item;
              }
          }
      
          return $found;
      }, []);
      
      sort($queries);
      

      给予:

      book bookmarks books end for holder kids rack reader shelf shelve stand
      

      https://3v4l.org/Xeaek

      把它放在一起:

      $fetch = static function(string $uri) {
          function_exists('curl_init') || die('cURL extension is not installed.');
      
          $handle = curl_init($uri);
          curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
          $data = json_decode(curl_exec($handle));
          curl_close($handle);
      
          return $data;
      };
      
      $modelQueries = static function($found, $result) {
          $items = explode(' ', $result->model->query);
      
          foreach($items as $item) {
              if (!in_array($item, $found)) {
                  $found[] = $item;
              }
          }
      
          return $found;
      };
      
      $bookModels = 'https://sug.daraz.pk/sug?area=lazada_pk_web&code=utf-8&q=book';
      
      $books = $fetch($bookModels);
      
      $bookQueries = array_reduce($books->result, $modelQueries, []);
      
      sort($bookQueries);
      

      【讨论】:

      • 我将 $data 更改为 url.. 获取 null... :?
      • @lyndria 我在答案中重新加入了一个例子。
      猜你喜欢
      • 1970-01-01
      • 2019-09-15
      • 2018-08-30
      • 1970-01-01
      • 2015-09-03
      • 2010-09-23
      • 1970-01-01
      相关资源
      最近更新 更多