Aktueller Standort: Startseite> Neueste Artikel> So kombinieren Sie Array_Diff_Ukey und Array_MAP, um einen komplexen Array -Schlüsselvergleich in PHP zu implementieren

So kombinieren Sie Array_Diff_Ukey und Array_MAP, um einen komplexen Array -Schlüsselvergleich in PHP zu implementieren

gitbox 2025-09-08

<span><span><span class="hljs-meta"><?php</span></span><span> </span><span><span class="hljs-comment">// 本文将探讨在 PHP 中如何结合 array_diff_ukey 和 array_map 来实现更复杂的数组键比较场景。</span></span><span> </span><span><span class="hljs-comment">// array_diff_ukey 提供了自定义键比较的能力,而 array_map 则可以帮助我们对数据进行预处理,</span></span><span> </span><span><span class="hljs-comment">// 两者结合能够解决一些仅靠单一函数无法处理的问题。</span></span><span> </span><span><span class="hljs-comment">// --------------------------------------------</span></span><span> 在 PHP 的数组操作中,常见的函数如 `array_diff`、`array_diff_assoc`、`array_diff_key` 都提供了 对数组值或键的差集比较功能。然而,当我们需要在 **键的比较逻辑上引入自定义规则** 时, `array_diff_ukey` 就显得非常有用。它允许开发者传入一个用户自定义的回调函数,来决定两个键 在比较时的先后关系。 例如,假设我们有两个数组: ```php </span><span><span class="hljs-variable">$array1</span></span><span> = [ </span><span><span class="hljs-string">"User_01"</span></span><span> => </span><span><span class="hljs-string">"Alice"</span></span><span>, </span><span><span class="hljs-string">"User_02"</span></span><span> => </span><span><span class="hljs-string">"Bob"</span></span><span>, </span><span><span class="hljs-string">"User_03"</span></span><span> => </span><span><span class="hljs-string">"Charlie"</span></span><span> ]; </span><span><span class="hljs-variable">$array2</span></span><span> = [ </span><span><span class="hljs-string">"user_1"</span></span><span> => </span><span><span class="hljs-string">"Alice"</span></span><span>, </span><span><span class="hljs-string">"user_4"</span></span><span> => </span><span><span class="hljs-string">"David"</span></span><span> ]; </span></span>

Standardmäßig erkennt Array_Diff_Ukey Ähnlichkeiten zwischen "user_01" und "user_1" nicht.
Wenn die Geschäftslogik uns vergleichen muss, müssen wir uns kombinieren
Array_Map für die Vorverarbeitung.

Verwenden Sie Array_Map zur Normalisierung von Schlüssel

Wir können Array_Map und Array_Keys verwenden, um einen "Standardisierungsvorgang" für Array -Tasten durchzuführen, sie in ein einheitliches Format umzuwandeln und dann zu vergleichen:

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">normalizeKey</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$key</span></span></span><span>) {
    </span><span><span class="hljs-comment">// Entfernen Sie den Unterstrich und drehen Sie sich in Kleinbuchstaben</span></span><span>
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-string">"_"</span></span><span>, </span><span><span class="hljs-string">""</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>));
}

</span><span><span class="hljs-variable">$normalized1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_combine</span></span><span>(
    </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">"normalizeKey"</span></span><span>, </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>)),
    </span><span><span class="hljs-title function_ invoke__">array_values</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>)
);

</span><span><span class="hljs-variable">$normalized2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_combine</span></span><span>(
    </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">"normalizeKey"</span></span><span>, </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array2</span></span><span>)),
    </span><span><span class="hljs-title function_ invoke__">array_values</span></span><span>(</span><span><span class="hljs-variable">$array2</span></span><span>)
);
</span></span>

Zu diesem Zeitpunkt wurden die Schlüssel von $ Normalized1 und $ Normalized2 gleichmäßig in "Kleinbuchstaben ohne Unterstrich" umgewandelt.

Kombinieren Sie Array_Diff_Ukey, um einen komplexen Vergleich zu erreichen

Als nächstes können wir Array_Diff_Ukey verwenden, um zu vergleichen:

 <span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_diff_ukey</span></span><span>(</span><span><span class="hljs-variable">$normalized1</span></span><span>, </span><span><span class="hljs-variable">$normalized2</span></span><span>, function(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strcmp</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>);
});

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span></span>

Das Ausgangsergebnis ist:

 <span><span>Array
(
    [</span><span><span class="hljs-meta">user02</span></span><span>] =&gt; Bob
    [</span><span><span class="hljs-meta">user03</span></span><span>] =&gt; Charlie
)
</span></span>

Wie zu sehen ist, werden User_01 und User_1 als die gleichen Schlüssel erkannt, wodurch das Differenzergebnis ausgeschlossen wird.

Zusammenfassen

Durch Kombination von Array_Maps Schlüsselstandardisierung von Array_MAP und ordentlicher Schlüsselvergleich von Array_Diff_Ukey ,
Wir sind in der Lage, eine komplexere Schlüsselanpassungslogik zu verarbeiten, z. B. das Ignorieren von Fall, das Entfernen bestimmter Zeichen und sogar die Implementierung einer teilweisen Übereinstimmung.
Dieser Ansatz ist besonders nützlich, wenn externe Datenquellen (z. B. API -Rückgabewerte, Benutzer -Upload -Daten) verarbeitet werden, da die Schlüssel für diese Daten häufig nicht immer in einem einheitlichen Format sind.

Diese idee flexible Funktionskombination kann nicht nur die Wartbarkeit des Codes verbessern, sondern uns auch dabei helfen, sich schnell an veränderbare Datenstrukturen anzupassen.

 <span></span>