33

I have a placeholder array called $holder, values as follows:

Array ( 
    [0] => Array ( 
        [id] => 1 
        [pid] => 121 
        [uuid] => 1  
        )
    [1] => Array ( 
        [id] => 2 
        [pid] => 13
        [uuid] => 1
        )
    [2] => Array ( 
        [id] => 5 
        [pid] => 121 
        [uuid] => 1
        )
    ) 

I am trying to pull out distinct/unique values from this multidimensional array. The end result I would like is either a variable containing (13,121), or (preferrably) an array as follows: Array( [0] => 13 [1] => 121 )

Again I've tried serializing and such, but don't quite understand how that works when operating with a single key in each array.

1

9 Answers 9

75

Seems pretty simple: extract all pid values into their own array, run it through array_unique:

$uniquePids = array_unique(array_map(function ($i) { return $i['pid']; }, $holder));

The same thing in longhand:

$pids = array();
foreach ($holder as $h) {
    $pids[] = $h['pid'];
}
$uniquePids = array_unique($pids);
Sign up to request clarification or add additional context in comments.

4 Comments

I wonder why this doesn't work array_unique(array_map(function ($i) { return $i[$id]; }, $holder)); Is there a way to use variable instead of predefined key name?
@deceze Ah, alright, it's inside of anonymous function. Thanks!
This works but is inefficient. Why add a bunch of elements and remove them immediately? Just loop over the array and filter one by one! I'm adding my own answer.
@Jorge Yes, this could be made more efficient by looping over the array once, putting all its elements into a new array as keys, then extracting just the keys. However, there's a tradeoff between readability, maintainability and performance, and I think this solution strikes a decent balance which will be just fine for average sized arrays.
42

In php >= 5.5 you can use array_column:

array_unique(array_column($holder, 'pid'));

Comments

4

try this

foreach($arr as $key => $val) {
    $new_arr[] = $val['pid'];
}
$uniq_arr = array_unique($new_arr);

Comments

4

Just iterate over it and apply an array_unique on the result:

foreach($holder as $yourValues){
    $pids[] = $yourValues['pid'];
}
$yourUniquePids = array_unique($pids);

Comments

4

Assuming your array is called $holder:

$unique = array();
foreach( $holder as $h )
    if( ! in_array($h, $unique ) )
        $unique[] = $h;

is a slightly more efficient way than via array_unique, I believe. May be the same.

1 Comment

in_array is essentially looping over the array again and again, so you've got two nested loops. That's inefficient in its own way.
1
$uniquearray = [];
    for($i=0;$i<count($assocarray);$i++){
        if(!in_array($assocarray[$i]['KEY'],$uniquearray)){
            $uniquearray[$i]= $assocarray[$i]['KEY'];
        }
}

1 Comment

Can you provide a brief explanation in addition to your code?
0

Hi Please try code given below for get unique values and then sort that values

<?php

$sort_arr = unique_sort($holder, 'pid');
echo "<pre>";
print_r($sort_arr);
echo"</pre>";

/*function for get unique value then sort them*/

function unique_sort($arrs, $id) {
    $unique_arr = array();
    foreach ($arrs AS $arr) {

        if (!in_array($arr[$id], $unique_arr)) {
            $unique_arr[] = $arr[$id];
        }
    }
    sort($unique_arr);
    return $unique_arr;
}

thanks

Comments

0

Because your identical values are probably integers (they can be safely used as array keys with risk of corruption/truncation), you can avoid calling array_unique() if you duplicate the second parameter of array_column() as the third parameter.

$uniqueness = array_column($array, 'id', 'id');
// [13 => 13, 121 => 121]

If your subsequent processing ignores keys, then you don't need to reindex the array.

Comments

-1

fo my situation i use this method

//get some data from db to array
while ($row = mysqli_fetch_assoc($query)){
   $data[] = $row;
}

//display unique value
echo "<table>";
$uniq = array();
foreach ($data as $row) {
    if(!in_array($row['path'], $uniq)) {
        $uniq[] = $row['path'];
        echo "<tr>";
        echo "<td>";
        echo $row['path'];
        echo "</td>";
        echo "<td>";
        echo $row['relationship_id'];
        echo "</td>";
        echo "</tr>";
    }
}
echo "</table>";

1 Comment

I don't see how that respond to the question: wich is getting unique value in a multidimensional array

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.