Erstes Array

[0]=> Brian
[1]=> A
[2]=> Leo
[3]=> A
[4]=> Mike

Zweites Array

[0]=> 1
[1]=> 2
[2]=> 3
[3]=> 4
[4]=> 5

Ich möchte überprüfen, ob im ersten Array Duplikate vorhanden sind. Wenn ja, speichern Sie nur das erste Vorkommen dieses Werts, das andere entfernt, merkt sich diese Schlüssel und löscht sie auch aus dem zweiten Array. Am Ende möchte ich haben

Erstes Array

[0]=> Brian
[1]=> A
[2]=> Leo
[3]=> Mike

Zweites Array

[0]=> 1
[1]=> 2
[2]=> 3
[3]=> 5

Ich habe es damit versucht, aber das zweite Array enthält keine Duplikate, sodass es nicht für beide Arrays funktioniert:

array_values(array_unique($array)); 
0
user12926637 19 Feb. 2020 im 18:16

3 Antworten

Beste Antwort

Du machtest

array_values(array_unique($array)); 

Dies gibt eindeutige Werte für $array, aber Sie werden nicht finden, welcher Index des zweiten Arrays deaktiviert werden muss.


Ansatz 1:

Ihr bester Schuss ist eine einfache for-Schleife mit einem isset Check. Wenn wir den bereits in unserem $set (einem neuen temporären Array) vorhandenen Wert finden, entfernen wir diesen Index von beiden ursprünglichen Arrays, andernfalls behalten wir ihn bei.

Snippet:

<?php

$arr1 = [
    'Brian',
    'A',
    'Leo',
    'A',
    'Mike'
];

$arr2 = [
        1,2,3,4,5
];

$set = [];

foreach($arr1 as $key => $value){
    if(!isset($set[$value])) $set[$value] = true;
    else{
        unset($arr1[$key]); // foreach creates a copy of $arr1, so safe to unset
        unset($arr2[$key]);
    }
}

print_r($arr1);
print_r($arr2);

Demo: https://3v4l.org/BQ9mA


Ansatz 2:

Wenn Sie for-Schleifen nicht mögen, können Sie dazu Array-Wrapper verwenden. Sie können array_combine verwenden, um das erste Array zu erstellen Werte als Schlüssel und zweite Arraywerte als Arrays. Beachten Sie, dass dadurch nur die neuesten Schlüsselwertpaare erhalten bleiben. Daher führen wir eine durch array_reverse, um nur Paare mit erstem Auftreten beizubehalten.

Snippet:

<?php

$arr1 = [
    'Brian',
    'A',
    'Leo',
    'A',
    'Mike'
];

$arr2 = [
        1,2,3,4,5
    ];

$filtered_data = array_combine(array_reverse($arr1),array_reverse($arr2));
print_r(array_keys($filtered_data));
print_r(array_values($filtered_data));

Demo: https://3v4l.org/mlstg

0
vivek_23 19 Feb. 2020 im 15:33

Bitte beachten Sie, dass array_unique Schlüssel beibehält, sodass Sie damit auch das zweite Array leicht filtern können:

$firstArray = array_unique($firstArray);
$secondArray = array_intersect_key($secondArray, $firstArray);

var_dump(array_values($firstArray), array_values($secondArray));

Aus den Dokumenten von array_unique:

Beachten Sie, dass die Schlüssel erhalten bleiben. Wenn mehrere Elemente unter den angegebenen sort_flags gleich verglichen werden, bleiben der Schlüssel und der Wert des ersten gleichen Elements erhalten.

0
Matei Mihai 19 Feb. 2020 im 16:06

Dadurch wird einfach ein temporäres Array unter Verwendung der Werte aus Ihren 2 Arrays erstellt.

Da wir Werte von $ a1 als Schlüssel verwenden, werden Dups überschrieben und gehen daher verloren. Die array_keys_exists() Prüfung stellt sicher, dass der erste Dup verwendet wird und nicht die nachfolgenden Dups. Dann teilen wir das Array einfach in zwei Eingabearrays auf.

$a1 = ['Brian', 'A', 'Leo', 'A', 'Mike'];
$a2 = [1,2,3,4,5];

#temp array created using values of $a1 as key so dups get dropped because they are reused

foreach ($a1 as $i=>$a) {
    if ( ! array_key_exists($a, $new)){
        $new[$a] = $a2[$i];
    }
}
$a1 = array_keys($new);
$a2 = array_values($new);

print_r($a1);
print_r($a2);

ERGEBNIS:

Array
(
    [0] => Brian
    [1] => A
    [2] => Leo
    [3] => Mike
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 5
)
0
RiggsFolly 19 Feb. 2020 im 15:55