Get unique value of one attribute from array of associative arrays
Asked Answered
F

5

9

I have an array like this:

$a = array(
    0 => array('type' => 'bar', 'image' => 'a.jpg'),
    1 => array('type' => 'food', 'image' => 'b.jpg'),
    2 => array('type' => 'bar', 'image' => 'c.jpg'),
    3 => array('type' => 'default', 'image' => 'd.jpg'),
    4 => array('type' => 'food', 'image' => 'e.jpg'),
    5 => array('type' => 'food', 'image' => 'f.jpg'),
    6 => array('type' => 'food', 'image' => 'h.jpg')
)

How do I figure out unique type values (which would be food, bar and default)? I could iterate through the array in a foreach loop but is there a better way doing it?

Feud answered 29/8, 2014 at 4:27 Comment(0)
D
18

In PHP >= 5.3 with the use of anonymous functions:

$unique_types = array_unique(array_map(function($elem){return $elem['type'];}, $a));

For previous versions you can declare a separate function:

function get_type($elem)
{
    return $elem['type'];
}

$unique_types = array_unique(array_map("get_type", $a));
Debbradebby answered 29/8, 2014 at 4:30 Comment(0)
S
18

Using PHP >= 5.5, you could do:

$ar = array_unique(array_column($a, 'type'));

print_r($ar):

Array ( 
    [0] => bar 
    [1] => food 
    [3] => default 
)

http://php.net/manual/en/function.array-column.php

http://php.net/manual/en/function.array-unique.php

Stob answered 29/8, 2014 at 4:30 Comment(7)
Not sure why this has +5 upvotes, it is a clever solution, not very much straight forward.Howsoever
@true How could this have been more straight forward? This looks like as simple as it gets. Using the updated functionalities available in newer versions of a language should be appreciated rather than getting confused about.Go
For 1. Having to look up what the array_* do, what they return, if they modify the array by reference..etc. It is just a clever solution, not very much else to say here. Please don't take it personal.Howsoever
So if someone has to look up why shouldn't they? It's like using mud buckets to cool water in 21st century just for the reason that I don't want to read power specifications of my Fridge that I just bought yesterday :) Plus even the OP mentioned they want are not looking for an old school method.Go
And nope nothing personal, its just a small discussion about whether to use newer tools available in the newer versions of language, you're entitled to your opinion as much as anyone else is, so nothing wrong there :)Go
@Mark M - Using language constructs rather than extensions would indicate you know the language .. foreach, isset are language constructs, array_* are extension functions that require implicit knmowledgeHowsoever
This is a neat solution but I'm using php 5.4, so can't really use this one.Feud
H
3

An old fashioned way without using the fancy array_* functions. This way is simple and easy to understand. You aren't left wondering what is happening because it so straightforward.

$a = array(
    0 => array('type' => 'bar', 'image' => 'a.jpg'),
    1 => array('type' => 'food', 'image' => 'b.jpg'),
    2 => array('type' => 'bar', 'image' => 'c.jpg'),
    3 => array('type' => 'default', 'image' => 'd.jpg'),
    4 => array('type' => 'food', 'image' => 'e.jpg'),
    5 => array('type' => 'food', 'image' => 'f.jpg'),
    6 => array('type' => 'food', 'image' => 'h.jpg')
);

$types = array();

foreach($a as $key => $type) {
        if(! isset($types[$type['type']]))
                $types[$type['type']] = $type['type'];
}

var_dump($types);
Howsoever answered 29/8, 2014 at 4:40 Comment(2)
Actually, one of the fastest answers due to any of array_* function provided does input array copying. Language constructs are better there.Offstage
That is interesting that you mention language constructs, because I just posted a comment about language constructs in one of the other answers before I read your comment.Howsoever
O
0

try this

$uniqueA = array_unique($a, "type");
// then to output the array just type
print_r($uniqueA);
Out answered 29/8, 2014 at 4:39 Comment(0)
K
0

You could also use array_reduce.

This only doesn't work if the values of the attribute are an array or object, because those can't be set as the key of an array.

function array_unique_attr($arr, $key) {

    return array_keys( array_reduce($arr, function($newArr, $event) {

        $newArr[$key] = true;
        return $newArr;

    }, []) );

}

$unique_types = array_unique_attr($a, 'type');
Katherinkatherina answered 23/10, 2015 at 18:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.