Redundante Blockwerte aus Array entfernen

tklustig

Erfahrenes Mitglied
Hallo Leute,
bin schon seit Stunden am Knobeln, wie man mit PHP einen Algorithmus erstellt, der redundante Blöcke eliminiert. Günstigstenfalls werden die Indizies der entfernten Elemente in ein seperates Array integriert, das wäre aber Priorität B. Hier ein var_dump() des Arrays:
1717160320755.png


Ein array_unique() hilft hier nicht weiter, da Blöcke, nicht einzelne Werte entfernt werden sollen, und zwar entweder der erste oder der letzte der jeweils beiden Blöcke. Das menschliche Auge erkennt sofort, dass Block_A: Indizie 10-14 und Block_B: Indizie 24-28 redundant sind. Auch Block_C: Indizie 18-23 und Block_D: Indizie 4-9 sind redundant. Zu entfernen ist ein Block aber nur, sofern die Angaben im assoziativen Eintrag product_id je Block identisch sind. Die Anzahl der Blockelemente ist dabei immer gleich. Leider gibt es keine Regelmäßigkeit bzgl. der Blöcke und deren Anzahl. Ist es überhaupt möglich, das algorithmisch umzusetzen?
Vorab vielen Dank für jedwelche Hilfestellungen
for($i=0;$i<count($arProducts);$i++){ //wie gehts hier weiter }
 

Anhänge

  • 1717160310749.png
    1717160310749.png
    28,8 KB · Aufrufe: 0
Zuletzt bearbeitet:
Lösung
Ich musste auch ein paar Mal lesen und nachdenken, aber ich denke, jetzt habe ich verstanden was das Ziel ist. Meine Idee: Bilde aus den Einträgen in product_id einen neuen Schlüssel als Kombination aus dem Wert in product_id und dem Wert in quantity_start. Mit diesem Schlüssel trage den Index in ein neues ass. Array ein. Das führt dazu, dass Elemente, die in Bezug auf product_id und quantity_start mehrfach sind, überschrieben werden. Etwa so:
Code:
$tempArray = [];
foreach ($quantity_start as $idx => $qu) {
    $newKey = $product_id[$idx] . '_' . $qu;
    $tempArray[$newKey] = $idx;
}
Funktioniert natürlich nur, wenn die betr. Werte nur zusammen hängend vorliegen und nicht z. B. zu einer 3-er Gruppe von "018ce7xyzusw" dieser Wert noch...
Kannst du Testdaten als Text zur verfügung stellen?
Und gleich noch das gewünschte Ziel in diesem Beipiel, da ich die Erläterung nicht vollständig verstehe
 
Ich musste auch ein paar Mal lesen und nachdenken, aber ich denke, jetzt habe ich verstanden was das Ziel ist. Meine Idee: Bilde aus den Einträgen in product_id einen neuen Schlüssel als Kombination aus dem Wert in product_id und dem Wert in quantity_start. Mit diesem Schlüssel trage den Index in ein neues ass. Array ein. Das führt dazu, dass Elemente, die in Bezug auf product_id und quantity_start mehrfach sind, überschrieben werden. Etwa so:
Code:
$tempArray = [];
foreach ($quantity_start as $idx => $qu) {
    $newKey = $product_id[$idx] . '_' . $qu;
    $tempArray[$newKey] = $idx;
}
Funktioniert natürlich nur, wenn die betr. Werte nur zusammen hängend vorliegen und nicht z. B. zu einer 3-er Gruppe von "018ce7xyzusw" dieser Wert noch Mal einsam wo anders auftritt. Wäre dann zu testen wenn Testdaten vorliegen.
War es das, was Du hiermit meintest:
Günstigstenfalls werden die Indizies der entfernten Elemente in ein seperates Array integriert, das wäre aber Priorität B.
Oder so:
Code:
$tempArray = [];
foreach ($quantity_start as $idx => $qu) {
    $newKey = $product_id[$idx] . '_' . $qu;
    if(!isset($tempArray[$newKey]) {
        $tempArray[$newKey] = $idx;
    } else {
        unset($quantity_start[$idx];
        unset($product_id[$idx];
    }
}
Dann hättest Du gleich die bereinigten Array in der ursprünglichen Form vorliegen.
 
Zuletzt bearbeitet:
Lösung
Nach JSON konvertieren und mit echo ausgeben, dann steht es dir für Copy&Paste zur Verfügung und jeder kann es zurück konvertieren.
 
Ah ,okay. Ich denke mal, du meinst die Konvertierung des im Screenshot aufgezeigten Arrays über json_encode(), korrekt?
 
Hier die Testdaten als JSON Array:
"{"id":["018de79872a37362b90480e6853b23aa","018fce8545a272d3bc8f2bcafa24676e","018fce854f007030a4c55052dd6cdb91","018fce855488735a96f827c79edfd05c","018fce8558ff732e83847f4dca857358","018fce85603170479ad5486a11c5339c","018fce85644d72e8b58546d2742e586a","018fce856847733bac609528e7602d8d","018fce856c5672da8dcd635b98141ca5","018fce85700e7344a671cfd75fd8c417","018fce85734573ca9a1ecf8331997c33","018fce85767d71f393fc3ab261ea46a0","018fce8579af70b09fd1172d37c22a2f","018fce857cfd70a7ae3ebee00748012f","018fce85802d70a7b40f1a0a330569fb","018fce8969b572cb95162bc57b99db08","018fce896afb70b4816ae6abcf069eba","018fce896b6a7214b6280e3c11ea6e28","018fce896bdd72a8a722633c7918c4c9","018fce896c4e7342880ad67cc6960ee0","018fce896cc070fbb27ac4fc48e0a462","018fce896d2e7260a103626a23550f3d","018fce896daf708688d9e27e980c67c3","018fce896e2670c7ad2cb46397246a10","018fce896e987221b4bc40539e9ea99f","018fce896f0673c8b506462823d69217","018fce896f747153b99a62ac8a621852","018fce896fe772a690308b31d47101c6","018fce89705670f9a49d46b596bb1646"],"quantity_start":[1,0,4,8,0,5,0,3,5,6,12,0,0,3,5,0,4,8,0,5,0,3,5,6,12,0,0,3,5],"product_id":["11dc680240b04f469ccba354cbf0b967","018fce786dac732abb66fff60df7da24","018fce786dac732abb66fff60df7da24","018fce786dac732abb66fff60df7da24","018fce786e3273ca93059cad79259c8d","018fce786e3273ca93059cad79259c8d","018fce786eaf725f9b9e265f4dca532b","018fce786eaf725f9b9e265f4dca532b","018fce786eaf725f9b9e265f4dca532b","018fce786f2b73f295e98ba54e1ff7eb","018fce786f2b73f295e98ba54e1ff7eb","018fce786f2b73f295e98ba54e1ff7eb","018fce786faa73d9ae406145fe9b0516","018fce786faa73d9ae406145fe9b0516","018fce786faa73d9ae406145fe9b0516","018fce786dac732abb66fff60df7da24","018fce786dac732abb66fff60df7da24","018fce786dac732abb66fff60df7da24","018fce786e3273ca93059cad79259c8d","018fce786e3273ca93059cad79259c8d","018fce786eaf725f9b9e265f4dca532b","018fce786eaf725f9b9e265f4dca532b","018fce786eaf725f9b9e265f4dca532b","018fce786f2b73f295e98ba54e1ff7eb","018fce786f2b73f295e98ba54e1ff7eb","018fce786f2b73f295e98ba54e1ff7eb","018fce786faa73d9ae406145fe9b0516","018fce786faa73d9ae406145fe9b0516","018fce786faa73d9ae406145fe9b0516"]} ◀"
 
Expliziten Dank an Sempervivum. Dein Algorithmus scheint stimmig zu sein. Alle Achtung! Ich habe ihn noch nicht nicht für alle Konstellationen getestet, aber der erste Eindruck ist durchweg positiv. Hier die Methode, die Deinen Algorithmus implementiert.
PHP:
private function getIds2BeRemoved(Context $context): array
{
$arItems = array();
$tempArray = array();
$criteria = new Criteria();
$objAllItems = $this->staffelPricesRepository->search($criteria, $context);
foreach ($objAllItems->getElements() as $item) {
        $arItems['id'][] = $item->getUniqueIdentifier();
        $arItems['quantity_start'][]=$item->getQuantityStart();
        $arItems['product_id'][]=$item->getProductId();
  }
$arCopy = $arItems;
 foreach ( $arItems['quantity_start'] as $value => $key) {
        $newKey =$arItems['product_id'][$value] . '_' . $key;
        if(!isset($tempArray[$newKey]))
              $tempArray[$newKey] = $value;
         else {
               unset($arItems['quantity_start'][$value]);
               unset( $arItems['product_id'][$value]);
               unset( $arItems['id'][$value]);
        }
    }
$arIds2BeDeleted = array_diff($arCopy['id'], $arItems['id']);
$arIds2BeDeleted=array_values($arIds2BeDeleted);
return $arIds2BeDeleted;
}
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück