Wie gibt man ein Array mit True/False-Werten zurück, wenn man 2 Arrays vergleicht?

Lesezeit: 4 Minuten

Benutzer-Avatar
Luqsus

Ich versuche, ein Array als Ergebnis des Vergleichs von 2 Arrays zu generieren: Das 1. Array enthält mehr Elemente wie:

array1: {
    0 => "car1"
    1 => "car2"
    2 => "car3"
    3 => "car4"
    4 => "car5"
}

und 2. Array hat nicht alle Elemente:

array2: {
    0 => "car1"
    1 => "car4"
    2 => "car5"
}

Es gibt also alle möglichen Kategorien (Array1) und Post-Kategorien (Array2) (es ist eine WordPress-Sache).
Ich versuche, diese Arrays zu vergleichen (aber nicht mit array_diff() Funktion, die mir Elemente Werte statt boolean gab) und das Ergebnis als true/false erhalten. Also möchte ich jeden Wert von Arrays vergleichen und generieren Array-Karte oder vielleicht mit array_combine() Funktion, um ein Array wie folgt zu erhalten:

result_array: {
    "car1": true,
    "car2": false,
    "car3": false
}

etc…
Es ist wichtig, dass das Ausgabearray alle Kategorien und ihre Ergebnisse (wahr, falsch) für die Post enthält.
Gibt es eine einfache Möglichkeit, dies zu tun, oder ist es vielleicht eine Funktion, die ich verwenden könnte?

Benutzer-Avatar
random_user_name

Arrays machen Spaß!

PHP hat eine TONNE von Array-Funktionen, und daher gibt es viele mögliche Lösungen.

Ich habe mir diese als persönliche Herausforderung ausgedacht, die keine Schleifen, Filter oder Karten verwendet.

Diese Lösung verwendet array_intersect um dann Werte zu finden, die in beiden Arrays vorhanden sind array_values zusammen mit array_fill_keys um sie in assoziative Arrays zu verwandeln, mit denen sie gefüllt sind TRUE oder FALSEund schlussendlich array_merge um sie zu einem einzigen Array zusammenzufügen:

$array1 = array( 0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5");
$array2 = array( 0 => "car1", 1 => "car4", 2 => "car5" );

// Find all values that exist in both arrays
$intersect = array_intersect( $array1, $array2 );
// Turn it into an associative array with TRUE values
$intersect = array_fill_keys( array_values($intersect), TRUE );
// Turn the original array into an associative array with FALSE values
$array1 = array_fill_keys( array_values( $array1 ), FALSE );

// Merge / combine the arrays - $intersect MUST be second so that TRUE values override FALSE values
$results = array_merge( $array1, $intersect );

var_dump( $results ); ergibt:

array (size=5)
  'car1' => boolean true
  'car2' => boolean false
  'car3' => boolean false
  'car4' => boolean true
  'car5' => boolean true

  • Clever! array_fill_keys ist eine Funktion, die ich noch nie verwenden musste.

    – Paul Carlton

    24. November 2016 um 0:44 Uhr

Benutzer-Avatar
Paul Carlton

array_map oder array_combine gibt nicht wirklich zurück, was Sie wollen. Wenn Sie verwenden möchten array_map Um den gewünschten Effekt zu erzielen, ohne eine Foreach-Schleife zu schreiben, erhalten Sie unten das gewünschte Ergebnis. Beachten Sie, dass Sie bestehen müssen array3 Als Referenz.

<?php 

$array1 = array( 0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5");
$array2 = array( 0 => "car1", 1 => "car4", 2 => "car5" );
$array3 = [];

array_map(function($a) use ($array2, &$array3) {
    $array3[$a] = in_array($a, array_values($array2));
}, $array1);

var_dump($array3);

Ausgabe:

array(5) {
  ["car1"]=>
   bool(true)
  ["car2"]=>
   bool(false)
  ["car3"]=>
   bool(false)
  ["car4"]=>
   bool(true)
  ["car5"]=>
   bool(true)
}

Dies ist langsam, aber es sollte tun, was Sie wollen, und leicht zu verstehen sein.

// Loop over the outer array which we're told has all the categories
$result = array();
foreach($array1 as $sCar1) {
  $found = false;

  // Loop over the categories of the post
  foreach($array2 as $sCar2) {

    // If the current post category matches
    // the current category we're searching for
    // note it and move on
    if($sCar2 == $sCar1) {
        $found = true;
        break;
    }
  }

  // Now indicate in the result if the post has the current category
  $result[$sCar1] = $found;
}

Benutzer-Avatar
rrr_2010

<?php
//EXAMPLE 1

$array1 = [0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5"];
$array2 = [0 => "car1", 1 => "car4", 2 => "car5"];
$resultArray = [];

foreach ($array1 as $key => $val) {
    $resultArray[$val] = in_array($val, $array2);
}

var_dump($resultArray);
?>

<?php
//EXAMPLE 2

$array1 = [0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5"];
$array2 = [0 => "car1", 1 => "car4", 2 => "car5"];
$resultArray = [];

$flipped = array_flip($array2);

foreach ($array1 as $key => $val) {
    $resultArray[$val] = isset($flipped[$val]);
}


var_dump($resultArray);

?>

ERGEBNIS:

array (size=5)
  'car1' => boolean true
  'car2' => boolean false
  'car3' => boolean false
  'car4' => boolean true
  'car5' => boolean true

Benutzer-Avatar
sevavietl

Mit array_count_values so einfach ist das:

$results = array_map(function ($count) {
    return $count !== 1;
}, array_count_values(array_merge($array1, $array2)));

Im Grunde führen wir also zwei Arrays zusammen und zählen dann das Vorkommen von Werten. Dann, wenn ein Zählwert nicht gleich 1 ist, ordnen wir den Wert zu trueund ansonsten – false. Interessant, das Dies funktioniert unabhängig davon, welches Array kürzer ist.

Hier ist funktionierende Demo.

Beachten Sie, dass array_count_values Funktion wirft E_WARNING für jedes Element, das kein String oder Integer ist. Dieser Ansatz funktioniert also nur bei Arrays aus Strings und Ganzzahlen.

Dieser Ansatz kann auch fehlschlagen, wenn Ihre Array-Elemente nicht eindeutig sind. Für diese Situation müssen Sie sich bewerben array_unique zu jedem Array vorher.

1383870cookie-checkWie gibt man ein Array mit True/False-Werten zurück, wenn man 2 Arrays vergleicht?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy