Saya mendapat array seperti ini

array
  0 => string 'Schmitt' (length=6)
  1 => string 'Maier' (length=1)
  2 => string 'Müller' (length=7)
  3 => string 'müller' (length=7)
  4 => string 'mueller' (length=7)
  5 => string 'Toll' (length=4)

Dan saya ingin mendapatkan sesuatu seperti ini

array
  0 => string 'Schmitt' (length=6)
  1 => string 'Maier' (length=1)
  2 => string 'Müller' (length=7)
  3 => string 'Toll' (length=4)

Saya ingin memeriksa semua umlaut seperti 'ä' 'ö' 'ü' dan seharusnya tidak peka huruf besar/kecil. Huruf pertama akan menjadi huruf besar, tapi ini akan saya dapatkan sendiri. Hanya perlu bantuan dengan hal-hal fonetik, karena saya tidak ingin melakukan hal yang besar if...else.

1
BraveButter 16 Maret 2017, 14:26

2 jawaban

Jawaban Terbaik

Anda dapat melakukannya dengan menyimpan "versi fonetik" sebagai kunci dalam larik hasil (dengan cara ini Anda dapat mengetahui apakah kata telah ditambahkan tanpa mencari dengan in_array, Anda hanya perlu memeriksa apakah kunci tersebut ada):

$names = ['Schmitt', 'Maier', 'Müller', 'müller', 'mueller', 'Toll'];
$rules = ['ü' => 'ue', 'ä' => 'ae', 'ö' => 'oe', 'ß' => 'ss' ]; // uzw

$result = [];

foreach ($names as $name) {
    $phonetic = strtr(mb_strtolower($name), $rules);
    if ( !isset($result[$phonetic]) )
        $result[$phonetic] = $name; // put mb_ucfirst here
}

$result = array_values($result);

print_r($result);

Karena Anda berurusan dengan karakter multi-byte, Anda perlu menggunakan mb_strtolower untuk menghindari kesalahan. Untuk alasan yang sama, jika Anda perlu membuat karakter pertama menjadi huruf besar, Anda harus menggunakan fungsi yang diposting oleh plemieux di panduan php:

function mb_ucfirst($str) {
    $fc = mb_strtoupper(mb_substr($str, 0, 1));
    return $fc . mb_substr($str, 1);
}
1
Casimir et Hippolyte 16 Maret 2017, 13:47

Anda dapat mencoba sesuatu seperti ini:

$replacements = ['ü' => ['ue']];

$names = ['Schmitt', 'Maier', 'Müller', 'müller', 'mueller', 'Toll'];

$names = array_map('strtolower', $names);

$names = array_reduce($names, function ($carry, $name) use ($replacements) {

    foreach ($replacements as $replaceWith => $replaceWhat) {
        $name = str_replace($replaceWhat, $replaceWith, $name);
    }

    if (!in_array($name, $carry)) {
        $carry[] = $name;
    }

    return $carry;

}, []);

$names = array_map('ucfirst', $names);

var_dump($names);

Hasilnya akan menjadi:

array(4) {
  [0]=>
  string(7) "Schmitt"
  [1]=>
  string(5) "Maier"
  [2]=>
  string(7) "Müller"
  [3]=>
  string(4) "Toll"
}
1
Mihai Matei 16 Maret 2017, 11:42