简体   繁体   中英

get unique data from multi-dimensional array list

I have 2 records from 2 different query results. I have merged those data. but i have to display unique data depends on vName key. Here is my result:

{
    "val1": "9",
    "vName": "abc",
    "bname": "",
    "cname": "",
    "brid": "",
    "cmpid": "154",
    "logo": "",
    "banner": "",
    "description": "",
    "catids": "",
    "type": "company",
    "is_nav": "1",
    "bigthumb_logo": "",
    "compressthumb_logo": "",
    "bigthumb_banner": "",
    "compressthumb_banner": "",
    "sp_ar": "Aperitif"
},
{
    "val1": "9",
    "vName": "abc",
    "bname": "abc",
    "cname": "abc",
    "brid": "341",
    "cmpid": "154",
    "logo": "",
    "banner": "6c497c72bfec4c694c1cc2c49066e7a1.png",
    "description": "http:\/\/www.abc.com\/",
    "catids": "9",
    "sp_ar": "Aperitif",
    "type": "company",
    "is_nav": "1",
    "bigthumb_logo": "40cbcede9429cdb44895e0e6f4c050d2.png",
    "compressthumb_logo": "40cbcede9429cdb44895e0e6f4c050d2.png",
    "bigthumb_banner": "6c497c72bfec4c694c1cc2c49066e7a1.png",
    "compressthumb_banner": "6c497c72bfec4c694c1cc2c49066e7a1.png"
}

Expected result should be only one of them, compare with vName :

{
    "val1": "9",
    "vName": "abc",
    "bname": "",
    "cname": "",
    "brid": "",
    "cmpid": "154",
    "logo": "",
    "banner": "",
    "description": "",
    "catids": "",
    "type": "company",
    "is_nav": "1",
    "bigthumb_logo": "",
    "compressthumb_logo": "",
    "bigthumb_banner": "",
    "compressthumb_banner": "",
    "sp_ar": "Aperitif"
 }

How can i get the result?

Convert the data into an array where the key is your unique value.

You can do something like:

$data = array('this is your array of data');
$unique = array();
foreach($data as $value) {
    if(!array_key_exists($value['vName'], $unique)) {
        $unique[$value['vName']] = $value;
    }
}
// $unique now contains only arrays with a unique 'vName', using the first it finds in the original list

$new_array = array_values($unique);

Assuming you have a array of associative array stored in $data , the following code will filter it based on vName and store array of associative arrays with unique vName in $filtered_data

$taken = array();

$filtered_data = array_filter($data, function($value) {
    global $taken;
    if (in_array($value['vName'], $taken)) {
        return false;
    }
    else {
        $taken[] = $value['vName'];
        return true;
    }
});

Here, the variable $taken keeps track of all the vName values that are currently in the $filtered_data . If you find a duplicate vName (that is currently there in $taken ), it discards that element.

试试这个,它应该为您工作。

$input = array_map("unserialize", array_unique(array_map("serialize",$input)));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM