从Json数组中删除重复项的算法

时间:2017-01-24 21:09:05

标签: php arrays json sorting search

我有这个JSON数据:

<div class="parent nr1">
  <div class="child">Sample 1
  </div>
  <div class="child nr2">
  </div>
</div>

<div class="parent nr2">
  <div class="child">Sample 2
  </div>
  <div class="child nr2">
  </div>
</div>

<div class="parent nr3">
  <div class="child">Sample 3
  </div>
  <div class="child nr2">
  </div>
</div>

如何对数据格式进行排序。

[{"make":"Cadillac","model":"Escalade","year":"2006"},{"make":"Cadillac","model":"Escalade","year":"2005"},{"make":"Cadillac","model":"Escalade","year":"2004"},{"make":"Cadillac","model":"Escalade","year":"2003"},{"make":"Cadillac","model":"Escalade","year":"2002"},{"make":"Cadillac","model":"Escalade ESV","year":"2006"},{"make":"Cadillac","model":"Escalade ESV","year":"2005"},{"make":"Cadillac","model":"Escalade ESV","year":"2004"},{"make":"Cadillac","model":"Escalade ESV","year":"2003"},{"make":"Cadillac","model":"Escalade EXT","year":"2006"},{"make":"Cadillac","model":"Escalade EXT","year":"2005"},{"make":"Cadillac","model":"Escalade EXT","year":"2004"},{"make":"Cadillac","model":"Escalade EXT","year":"2003"},{"make":"Cadillac","model":"Escalade EXT","year":"2002"},{"make":"Chevrolet","model":"Astro","year":"2005"},{"make":"Chevrolet","model":"Astro","year":"2004"},{"make":"Chevrolet","model":"Astro","year":"2003"},{"make":"Chevrolet","model":"Avalanche 1500","year":"2006"},{"make":"Chevrolet","model":"Avalanche 1500","year":"2005"}]

我对PHP仍然非常新鲜,所以我很难弄清楚如何实现这一目标并删除重复项以及通过连接添加年份。

谢谢,

2 个答案:

答案 0 :(得分:0)

你必须用循环解析它。一个简单的版本看起来像:

$cars = json_decode($cars_json);
$carList = array();
foreach($cars as $car){
    if(!isset($carList[$car->make . $car->model])){
        $carList[$car->make . $car->model] = array(
            'firstYear' => $car->year,
            'lastYear' => $car->year,
            'make'=>$car->make,
            'model' => $car->model,
    }
    else{
        if($car->year < $carList[$car->make . $car->model]['firstYear'])
            $carList[$car->make . $car->model]['firstYear'] = $car->year;
        else if($car->year > $carList[$car->make . $car->model]['lastYear'])
            $carList[$car->make . $car->model]['lastYear'] = $car->year;
    }
}
//Parsing complete, now output

foreach($carList as $car){
  echo $car['make'] . " ";
  echo $car['model'] . " ";
  echo substr($car['firstYear'],-2) . "-" . substr($car['lastYear'], -2);
}

答案 1 :(得分:0)

$data = json_decode('[{"make":"Cadillac","model":"Escalade","year":"2006"},{"make":"Cadillac","model":"Escalade","year":"2005"},{"make":"Cadillac","model":"Escalade","year":"2004"},{"make":"Cadillac","model":"Escalade","year":"2003"},{"make":"Cadillac","model":"Escalade","year":"2002"},{"make":"Cadillac","model":"Escalade ESV","year":"2006"},{"make":"Cadillac","model":"Escalade ESV","year":"2005"},{"make":"Cadillac","model":"Escalade ESV","year":"2004"},{"make":"Cadillac","model":"Escalade ESV","year":"2003"},{"make":"Cadillac","model":"Escalade EXT","year":"2006"},{"make":"Cadillac","model":"Escalade EXT","year":"2005"},{"make":"Cadillac","model":"Escalade EXT","year":"2004"},{"make":"Cadillac","model":"Escalade EXT","year":"2003"},{"make":"Cadillac","model":"Escalade EXT","year":"2002"},{"make":"Chevrolet","model":"Astro","year":"2005"},{"make":"Chevrolet","model":"Astro","year":"2004"},{"make":"Chevrolet","model":"Astro","year":"2003"},{"make":"Chevrolet","model":"Avalanche 1500","year":"2006"},{"make":"Chevrolet","model":"Avalanche 1500","year":"2005"}]');

// Organize by make and model
foreach ($data as $row) {
  $organized[$row->make][$row->model][] = $row->year;
}

// Output.
foreach ($organized as $make => $models) {
  foreach ($models as $model => $years) {
    sort($years);
    // Use first value as range.
    $range = array_shift($years);
    // If there are more years, create a range.
    if (count($years)) {
      // Use last value as end of range.
      $range .= '-' . array_pop($years);
    }
    // Print formatted line with tabs.
    echo $make, "\t", $model, "\t", $range, "\n";
  }
}

输出:

Cadillac    Escalade    2002-2006
Cadillac    Escalade ESV    2003-2006
Cadillac    Escalade EXT    2002-2006
Chevrolet   Astro   2003-2005
Chevrolet   Avalanche 1500  2005-2006
在第一个$organized中创建的

foreach是一个多维数组,如下所示:

Array
(
    [Cadillac] => Array
        (
            [Escalade] => Array
                (
                    [0] => 2006
                    [1] => 2005
                    [2] => 2004
                    [3] => 2003
                    [4] => 2002
                )

            [Escalade ESV] => Array
                (
                    [0] => 2006
                    [1] => 2005
                    [2] => 2004
                    [3] => 2003
                )

            [Escalade EXT] => Array
                (
                    [0] => 2006
                    [1] => 2005
                    [2] => 2004
                    [3] => 2003
                    [4] => 2002
                )

        )

    [Chevrolet] => Array
        (
            [Astro] => Array
                (
                    [0] => 2005
                    [1] => 2004
                    [2] => 2003
                )

            [Avalanche 1500] => Array
                (
                    [0] => 2006
                    [1] => 2005
                )

        )

)
相关问题