Alternative zu array_unique() bzgl. Key/Value

tklustig

Erfahrenes Mitglied
Hallo Leute,
gegeben sei folgendes Array $arDescription:
1719388887152.png
Ich versuche mittels folgender Anweisung alle redundaten Value Einträge entfernen zu lassen. Das funktioniert aber bekanntlich nicht, da sich der Key nicht unterscheidet. Wie gehe ich also vor, um dennoch alle mehrfachen Elemente zu bereinigen, so das nur noch jeweils ein Key=>Value Paar vorhanden ist?
PHP:
 $arrayUnique = array_unique($arDescriptions,SORT_REGULAR);
 

Anhänge

  • 1719388878814.png
    1719388878814.png
    26 KB · Aufrufe: 0
Kommt mir irgend wie bekannt vor, hatten wir das nicht schon mal? Oder war es bei jemand anders?
Lösung war, parallel ein Hilfsarray zu führen mit dem Value als Schlüssel und zu prüfen ob ein Element schon drin ist.
 
Na ja, ich versuche es so, aber das führt nicht zum Ziel. Das Array wird komplett geleert:
PHP:
$tempArr = array_unique(array_column($arDescriptions, 'value'));
var_dump(array_intersect_key($arDescriptions, $tempArr));

Edit:
Wenn ich $arDescriptions so umgestalte, dass es wie folgt aufgebaut ist, klappt das mit meiner Lösung:

1719390267779.png
 
Zuletzt bearbeitet:
Weiß nicht genau ob es da auch eine Lösung mit den vorgefertigten Funktionen gibt, aber dies müsste auf jeden Fall funktionieren (ungetestet):
Code:
$helpArray = [];
$filteredArray = array_filter($yourArray, function ($val) {
    $helpKey = array_keys($val)[0];
    $helpVal = $val[0][$helpKey];
    if (!isset($helpArray[$helpVal])) {
        $helpArray[$helpVal] = true;
        return true;
    }
    return false;
});
 
Habe Deine Lösung nicht getestet, da die Folgende funktioniert, aber dennoch vielen Dank für Deine Hilfe. Hier der gesamte Code, damit Nachfolger auch was damit anfangen können:
PHP:
    /**
     * @param Context $context
     * @return array
     */
    private function getCategories(Context $context): array {
        $arDescriptions = array();
        $criteria = new Criteria();
        $categories = $this->categoryRepository->search($criteria, $context);
        foreach ($categories as $item) {
            $arDescriptions[] = array('id' => $item->getUniqueIdentifier(), 'value' => $item->getName());
        }
        $tempArr = array_unique(array_column($arDescriptions, 'value'));
        $arUnique = array_intersect_key($arDescriptions, $tempArr);
        $arUnique = array_values($arUnique);
        $ar2BeReturned = array_diff(array_column($arDescriptions, 'id'), array_column($arUnique, 'id'));
        $ar2BeReturned = array_values($ar2BeReturned);
        return $ar2BeReturned;
    }
 
Zurück