Mehrdimensionales Array sortieren

marvinlol

Erfahrenes Mitglied
Hi zusammen,

ich bekomme von der Google AdWords API folgendes Array zurückgeliefert und bin mit der Struktur etwas überfordert. Dieses Array liefert mit Keyword-Ideen von Google AdWords und letztendlich möchte ich damit die drei Keywords mit den meisten Suchanfragen ausgeben.

z.B.:
Keyword X = 1200
Keyword Y = 900
Keyword Z = 475

Das Array liefert mir 300 Ergebnisse. Hier mal die ersten zwei. Aus den 300 möchte ich die drei mit dem höchsten Search Volume Wert ausgeben: ($data['SEARCH_VOLUME']->value).

PHP:
Array
(
    [0] => TargetingIdea Object
        (
            [data] => Array
                (
                    [0] => Type_AttributeMapEntry Object
                        (
                            [key] => KEYWORD_TEXT
                            [value] => StringAttribute Object
                                (
                                    [value] => keyword test
                                    [AttributeType] => StringAttribute
                                    [_parameterMap:Attribute:private] => Array
                                        (
                                            [Attribute.Type] => AttributeType
                                        )

                                )

                        )

                    [1] => Type_AttributeMapEntry Object
                        (
                            [key] => SEARCH_VOLUME
                            [value] => LongAttribute Object
                                (
                                    [value] => 1200
                                    [AttributeType] => LongAttribute
                                    [_parameterMap:Attribute:private] => Array
                                        (
                                            [Attribute.Type] => AttributeType
                                        )

                                )

                        )

                )

        )

    [1] => TargetingIdea Object
        (
            [data] => Array
                (
                    [0] => Type_AttributeMapEntry Object
                        (
                            [key] => KEYWORD_TEXT
                            [value] => StringAttribute Object
                                (
                                    [value] => keyword vergleich
                                    [AttributeType] => StringAttribute
                                    [_parameterMap:Attribute:private] => Array
                                        (
                                            [Attribute.Type] => AttributeType
                                        )

                                )

                        )

                    [1] => Type_AttributeMapEntry Object
                        (
                            [key] => SEARCH_VOLUME
                            [value] => LongAttribute Object
                                (
                                    [value] => 900
                                    [AttributeType] => LongAttribute
                                    [_parameterMap:Attribute:private] => Array
                                        (
                                            [Attribute.Type] => AttributeType
                                        )

                                )

                        )

                )

        )

Habt ihr eine Idee, wie ich vorgehen kann?
Mein Ansatz war, die maximalen Werte herauszusuchen und dann ggf in einem neuen Array zu speichern.

Ich freue mich, wenn ihr Ideen habt.
Viele Grüße
Marvin
 
Einfach durchiterieren und die Values auslesen
PHP:
    //ids & values extrahieren
    //array(value => id)
    $ids = array();
    foreach ($arr as $id => $targetingIdea){
        foreach($targetingIdea->data as $typeAttributeMapEntry){
            if($typeAttributeMapEntry->key == 'SEARCH_VOLUME'){
                $ids[$typeAttributeMapEntry->value->value] = $id;
                break;
            }
        }
    }

    //nach Values (also der Key des Array $ids) sortieren
    krsort($ids);
    print_r ($ids);
    //Ausgeben des Eintrages mit der höchstgen Value
    print_r ($arr[array_values($ids)[0]]);
 
Hi

( edit: Alternative zu Yaslaw: )

mit usort kann man eine eigene Compare-Funktion angeben
PHP:
function meineFunktion1($a, $b)
{
    //...
}
...
usort($dasArray, "meineFunktion1");
Die Funktion bekommt dabei zwei Einträge aus dem Hauptarray, also zwei ganze Teilstrukturen, und gibt -1 bzw. +1 zurück, wenn $a vor $b bzw. $b vor $a sein soll (oder 0 wenn sich gleichwertig sind). In deiner Funktion holst du dir aus deiner speziellen Datenstruktur eben die Zahlen raus und vergleichst sie.

http://php.net/manual/de/function.usort.php
 
Wow, cool danke für eure schnellen Antworten!
Die Variante von Yaslaw funktioniert schon sehr gut. Der höchste Wert wird ausgegeben.

Wie kann ich die Top3 ausgeben lassen, statt nur den höchsten. Habs mit
Code:
    print_r(array_slice($page->entries[array_values($ids)], 0, 3));

versucht. Das hat allerdings nicht geklappt.

Viele Grüße
Marvin
 
PHP:
    //Die Top 3 auswählen
    $top3 = array();
    foreach (array_slice($ids, 0, 3, false) as $id){
        $top3[] = $arr[$id];
    }
 

Neue Beiträge

Zurück