php remove duplicates from multidimensional array by value

前端 未结 4 910
臣服心动
臣服心动 2020-12-20 13:52

I would like to remove duplicates by value as you can see from the list_title. I know there are several questions and answers to this but their solution doesn\'

相关标签:
4条回答
  • 2020-12-20 14:25

    Try this

    <?php
        function super_unique($array)
        {
          $result = array_map("unserialize", array_unique(array_map("serialize", $array)));
    
          foreach ($result as $key => $value)
          {
            if ( is_array($value) )
            {
              $result[$key] = super_unique($value);
            }
          }
    
          return $result;
        }
        ?>
    
    0 讨论(0)
  • 2020-12-20 14:27

    So basically you want to remove duplicates by 'list_title' column. Let's assume we keep the first occurrence of this title. Then you can use a couple of standard functions to achieve this:

    // Reverse array, so the first occurrence kept.
    $data = array_reverse($data);
    
    $result = array_reverse( // Reverse array to the initial order.
        array_values( // Get rid of string keys (make array indexed again).
            array_combine( // Create array taking keys from column and values from the base array.
                array_column($data, 'list_title'), 
                $data
            )
        )
    );
    

    Here is working demo.

    UPDATE:

    Based on @mickmackusa comment, the code can be simplified to:

    $result = array_reverse(array_values(array_column(
        array_reverse($data),
        null,
        'list_title'
    )));
    

    This is described in the docs regarding column_key parameter specs:

    It may also be NULL to return complete arrays or objects (this is useful together with index_key to reindex the array).

    0 讨论(0)
  • 2020-12-20 14:28

    Thanks everyone, sometimes over-thinking can affect common sense.

    I simply solved it from MYSQL query with something like:

     GROUP BY list_title ORDER BY list_date
    
    0 讨论(0)
  • 2020-12-20 14:31

    Just loop through the arrays and keep track of duplicate field entries.

    Only the list_id and list_title will be considered for duplicate arrays but extra fields can be added. All the other keys are ignored.

    <?php
    
    $array = [
        [
            "list_id" => 86,
            "list_reference" => 130948,
            "list_title" => "Offer:  apartment 2+kk",
            "list_city" => "Prague",
            "list_date" => "2017-03-03 11:20:35",
            "list_status" => 0,
            "list_creator" => "Company A",
            "list_price" => 30000,
            "list_furniture" => '""1","0","0""',
            "list_accommodation" => "flat"
        ],
        [
            "list_id" => 87,
            "list_reference" => 130947,
            "list_title" => "Offer:  apartment 2+kk", 
            "list_date" => "2017-03-03 11:20:35",
            "list_status" => 0,
            "list_creator" => "Company B",
            "list_price" => 30000,
            "list_furniture" => '""1","0","0""',
            "list_accommodation" => "flat"
        ]
    ];
    
    
    $duplicateFields = ["list_id" => array(), "list_title" => array()];
    foreach ($array as $index => $value) {
        if(in_array($value['list_id'], $duplicateFields['list_id']) || in_array($value['list_title'], $duplicateFields['list_title'])){
            unset($array[$index]);
        }else{
            array_push($duplicateFields['list_id'], $value['list_id']);
            array_push($duplicateFields['list_title'], $value['list_title']);
        }
    }
    
    var_dump($array);
    

    Which yields:

    array(1) {
      [0]=>
      array(10) {
        ["list_id"]=>
        int(86)
        ["list_reference"]=>
        int(130948)
        ["list_title"]=>
        string(22) "Offer:  apartment 2+kk"
        ["list_city"]=>
        string(6) "Prague"
        ["list_date"]=>
        string(19) "2017-03-03 11:20:35"
        ["list_status"]=>
        int(0)
        ["list_creator"]=>
        string(9) "Company A"
        ["list_price"]=>
        int(30000)
        ["list_furniture"]=>
        string(13) """1","0","0"""
        ["list_accommodation"]=>
        string(4) "flat"
      }
    }
    
    0 讨论(0)
提交回复
热议问题