Подтвердить что ты не робот

Без учета регистра array_unique

Я пытаюсь написать несколько строк кода, чтобы сделать уникальную функцию типа без учета регистра. Вот что я до сих пор:

foreach ($topics as $value) {
    $lvalue = strtolower($value);
    $uvalue = strtolower($value);

    if (in_array($value, $topics) == FALSE || in_array($lvalue, $topics) == FALSE || in_array($uvalue, $topics) == FALSE) {
        array_push($utopics, $value);
    }
}

Проблема - это оператор if. Я думаю, что что-то не так с моим синтаксисом, но я относительно новичок в PHP, и я не уверен, что это такое. Любая помощь?

4b9b3361

Ответ 1

function array_iunique( $array ) {
    return array_intersect_key(
        $array,
        array_unique( array_map( "strtolower", $array ) )
    );
}

Ответ 2

Вы устанавливаете как lvalue, так и uvalue в нижнюю версию.

 $uvalue = strtolower($value);

должен быть

 $uvalue = strtoupper($value);

Тем не менее, это может быть немного быстрее. Производительность вашей функции будет экспоненциально снижаться, в то время как она будет более или менее линейной (при догадках, а не в comp-sci major...)

<?php

function array_iunique($ar) {
  $uniq = array();
  foreach ($ar as $value)
    $uniq[strtolower($value)] = $value;
  return array_values($uniq);
}
?>

Ответ 3

Должен ли $uvalue быть не в верхнем регистре? Итак,

$uvalue = strtoupper($value):

Ответ 4

и другая альтернатива...

function array_iunique($topics) {

    $ltopics = array_map('strtolower', $topics);
    $cleanedTopics = array_unique($ltopics);

    foreach($topics as $key => $value) {
        if(!isset($cleanedTopics[$key])) {
            unset($topics[$key]);
        }
    }

    return $topics;

}

Pentium10 лучше.

Ответ 5

function array_unique_ci ($arr) {
    return array_intersect_key (
        $arr, array_unique (
            array_map ('strtolower', array_map ('trim', $arr))
        )
    );
}

Кроме того, это не мешает обрезать значения перед их сравнением.