Mehrdimensionales und einfaches Array gegeneinander vergleichen und bereinigen

preko

Erfahrenes Mitglied
Ich habe zwei Arrays:

1. Array "workflow":
PHP:
array
(
    [0] => array
        (
            [uid] => 140909
            [pid] => 0
            [date] => 1491556781
        )
    [1] => array
        (
            [uid] => 140910
            [pid] => 0
            [date] => 1495586886 
        )
    [2] => array
        (
            [uid] => 140915
            [pid] => 0
            [date] => 1495687800 
        )

                 .
                 .
                 .

    [4052] => array
        (
            [uid] => 155915
            [pid] => 0
            [date] => 1565677000 
        )

und dann noch:

2. Array "news":
PHP:
array
(
140900,140905,140909,140910...
);

Die Zahlen im zweiten Array enthalten Zahlen, die auch im oberen Array als "uid" auftauchen. Diese Datensätze sollen aus dem oberen Array gelöscht werden. Die zweite Liste ist quasi eine Ausschlußliste mit den uid`s der Datensätze, die im ersten Array gelöscht werden sollen. Danach soll der Index wieder neu geschrieben werden, aber erst wenn alle Löschungen vorgenommen worden sind.

Im o. g. Beispiel würden dann die ersten beiden Datensätze gelöscht werden, da die uid-Nr. im unteren Array vorkommt, der letzte Datensatz aber nicht. Im Anschluss daran müsste dann der Index neu erstellt werden, so dass der übrig gebliebene Datensatz den Index "0" statt bisher "2" erhält.

Ich habe an foreach() in Kombination mit array_split() gedacht, aber irgendwie funktioniert das nicht.

PHP:
foreach($workflow as $workflowSingle) {
      foreach($news as $newsSingle) {
            if ($workflowSingle['uid'] === $newsSingle) {
                  // Lösche Datensatz aus erstem Array
            }
                  else {
                        break;
                  }            
      }
}

Hat jemand eine Idee was das Mittel der Wahl ist?
 
Ich würde eher daran denken, nicht die Datensätze zu löschen, sondern das Array neu aufzubauen:
Mit array_filter() das Array abarbeiten und im Callback mit in_array() prüfen, ob die UID in news enthalten ist:
PHP:
    $workflow = [
        [
            "uid" => 140909,
            "pid" => 0,
            "date" => 1491556781
        ],
        [
            "uid" => 140910,
            "pid" => 0,
            "date" => 1495586886
        ],
        [
            "uid" => 140915,
            "pid" => 0,
            "date" => 1495687800
        ],
        [
            "uid" => 140916,
            "pid" => 0,
            "date" => 1495687800
        ]
    ];
    $news = [140909,140915];
    $workflow_filtered = array_values(array_filter($workflow, function($var) {
        global $news;
        return !in_array($var["uid"], $news);
    }));
    var_dump($workflow_filtered);
 
Zuletzt bearbeitet:
Vielen dank Sempervivum, allerdings funktioniert es leider nicht.

Ich bekomme in der Tat die Gesamtzahl der Datensätze (4857) aus dem Array "workflow" ausgegeben, allerdings nicht reduziert um die Anzahl der Datensätze (96) aus dem Array "news", die herausgefiltert werden sollen.

Es werden die 96 Datensätze aus "news" anscheinen ans Ende des Mehrdimensionalen Arrays "workflow" angehängt, reduziert um den kompletten Schlüssel "uid".

Ob nun die einzelnen Unterarrays aus "workflow" tatsächlich herausgefiltert worden sind, kann ich im Moment nicht nachhalten.
 
Zuletzt bearbeitet:
Verstehe ich nicht. Was ich gepostet habe, hatte ich vorher getestet und es hat genau so funktioniert, wie man es erwartet. Ausgabe:
PHP:
array (size=2)
  0 =>
    array (size=3)
      'uid' => int 140910
      'pid' => int 0
      'date' => int 1495586886
  1 =>
    array (size=3)
      'uid' => int 140916
      'pid' => int 0
      'date' => int 1495687800
d. h. es sind die beiden Datensätze übrig geblieben, wo die UID nicht in $news ist.
Hast Du es genau so übernommen, wie ich es gepostet habe?
 
Hab es jetzt so gelöst indem ich die Datenbankabfrage so gestaltet habe, dass
  • in der ersten Abfrage alle Arrays aus workflow mit gewünschter Sortierung und
  • in der zweiten Abfrage alle news, die raus müssen, gelesen werden.
Anschließend entferne ich den/die jeweiligen Datensatz/-sätze aus dem workflow-Array wie folgt:

PHP:
...
        $arrayCounter = "0";

        foreach($workflow as $workflowSingle) {
            foreach($news as $newsSingle) {
                if ($workflowSingle["identifier"] == $newsSingle["uid"]) {
                    array_splice($workflow, $arrayCounter, 1);
                }
            }
        $arrayCounter++;
        }
        return $workflow;

Nun hat es sich ergeben, dass der Schlüssel "identifier" im Array workflow (der auch noch existiert, ich aber zunächst aus Übersichtlichkeitsgründen weggelassen hatte, da ursprünglich als nicht benötigt angesehen) derjenige war, der mit der uid aus dem Array news verglichen werden musste in diesem Lösungsweg.

Nun stimmt auch die Anzahl der ausgegebenen Arrays und auch der Inhalt.

Vielen Dank an alle, die sich mit ihren Ideen beteiligt haben!
 
Zurück