PHP - Как вставить новый элемент в массив, избегая дубликатов?

Я хочу создать функцию, которая принимает в качестве входных параметров массив $arr_previsioni, значение $previsione и число $pos, указывающее позицию.
Функция должна:
1 - добавьте значение $previsione, если оно еще не существует.
2 - Если значение $previsione, указанное во входных данных, уже присутствует в массиве, он должен изменить значение $previsione так, чтобы оно не отличалось от всех остальных, и в конце добавить его в массив.

По сути, учитывая входное число x, я должен создать массив уникальных чисел с этим приоритетом: если число x, которое я дал на входе, уже присутствует в массиве, то нам нужно изменить число x (добавляя или вычитая что-то), чтобы сделать его уникальным.


function aggiungiPrevisione($previsione,$pos,$arr_previsioni){

    echo '<br>';

    // if it is the first element of the array
    if ($pos == 1){
        $arr_previsioni['PREVISIONE1'] = $previsione;
        return $arr_previsioni;
    }


    $numero_elementi = count($arr_previsioni);   

    foreach($arr_previsioni as $key=>$value){

        for($i=0; $i <= $numero_elementi+2; $i++){

            // Verifica se esiste
            if (in_array($previsione, $arr_previsioni)){
                // The same number was found in array
                if ($previsione  > 45){
                    $previsione = $previsione - 13;
                } else {
                    $previsione = $previsione + 13;
                }
                $previsione = getNumeroGiocabile($previsione); // returns a number from 0 to 90

            } // end checking

        } // end for

    } // end foreach


    // Add $previsione in array
    $arr_previsioni['PREVISIONE'.$pos] = $previsione; // by Vincent Decaux


    return $arr_previsioni;


}

$previsione = makePrevisione(); // return number from 1 to 90
$arr_previsioni = array(); // initially empty
for($pos=1; $pos<=24; $pos++){
   $arr_previsioni = aggiungiPrevisione($previsione,$pos,$arr_previsioni);
} 

var_dump($arr_previsioni);

Созданная мной функция возвращает массив из 24 элементов, но некоторые из них совпадают с другими. Вот значения массива:

array(24) {
  ["PREVISIONE1"]=>
  int(30)
  ["PREVISIONE2"]=>
  int(71)
  ["PREVISIONE3"]=>
  int(22)
  ["PREVISIONE4"]=>
  int(1)
  ["PREVISIONE5"]=>
  int(67)
  ["PREVISIONE6"]=>
  int(51)
  ["PREVISIONE7"]=>
  int(35)
  ["PREVISIONE8"]=>
  int(14)
  ["PREVISIONE9"]=>
  int(72)
  ["PREVISIONE10"]=>
  int(57)
  ["PREVISIONE11"]=>
  int(11)
  ["PREVISIONE12"]=>
  int(76)
  ["PREVISIONE13"]=>
  int(41)
  ["PREVISIONE14"]=>
  int(40)
  ["PREVISIONE15"]=>
  int(39)
  ["PREVISIONE16"]=>
  int(37)
  ["PREVISIONE17"]=>
  int(34)
  ["PREVISIONE18"]=>
  int(29)
  ["PREVISIONE19"]=>
  int(42)
  ["PREVISIONE20"]=>
  int(55)
  ["PREVISIONE21"]=>
  int(55)
  ["PREVISIONE22"]=>
  int(55)
  ["PREVISIONE23"]=>
  int(55)
  ["PREVISIONE24"]=>
  int(55)
}

как видите, есть повторяющиеся значения (55). Я хотел бы, чтобы функция вставляла номер $previsione, как указано, в случае, если он еще не существует в массиве, иначе ему пришлось бы изменить значение $previsione (чтобы получить номер, которого еще нет) и добавить это в массив.

Посмотрим, смогу ли я упростить понимание проблемы.
Указав эти входные параметры:

$arr_previsione = (
  "PREVISIONE1"=>
  30,
  "PREVISIONE2"=>
  71,
  "PREVISIONE3"=>
  22,
  "PREVISIONE4"=>
  1,
  "PREVISIONE5"=>
  67,
  "PREVISIONE6"=>
  51,
  "PREVISIONE7"=>
  35);

$pos = 8;
$previsione = 22;
$arr_previsioni = aggiungiPrevisione($previsione8,8,$arr_previsioni);


Результат, который я могу сейчас получить с помощью функции, показанной выше, может быть таким:

$arr_previsione = (
  "PREVISIONE1"=>
  30,
  "PREVISIONE2"=>
  71,
  "PREVISIONE3"=>
  22,
  "PREVISIONE4"=>
  1,
  "PREVISIONE5"=>
  67,
  "PREVISIONE6"=>
  51,
  "PREVISIONE7"=>
  35,
  "PREVISIONE8"=>
  22); // error


Что я предпочел бы получить, так это:

$arr_previsione = (
  "PREVISIONE1"=>
  30,
  "PREVISIONE2"=>
  71,
  "PREVISIONE3"=>
  22,
  "PREVISIONE4"=>
  1,
  "PREVISIONE5"=>
  67,
  "PREVISIONE6"=>
  51,
  "PREVISIONE7"=>
  35,
  "PREVISIONE8"=>
  48); // after the change the new value entered should be 48 or any other number, it is enough that it is not already present in the array itself

Надеюсь, я объяснил себя

Так у вас ошибка или проблема? Кстати, $arr_previsioni['PREVISIONE'. $pos] = $previsione; избежит 24 условий...

Vincent Decaux 13.07.2019 12:20

Пожалуйста, редактировать ваш вопрос и включите пример массива, входных значений для вашей функции и ожидаемых результатов.

Dave 13.07.2019 12:21

Это может быть очень простая проблема для решения, но я не понимаю вашего вопроса. Можем ли мы увидеть пример ввода и желаемый результат? Кажется, я не могу найти рекурсию в вашем вопросе.

mickmackusa 13.07.2019 12:25

Я все еще не понимаю вопроса. Возможно, было бы полезно, если бы вы объяснили, для чего используется этот код? Я понимаю, что Previsione — это прогноз, но прогнозирование чего? Также наличие чего-то вроде $previsione = getNumeroGiocabile($previsione); в вашем коде не помогает. Это просто не имеет смысла, особенно потому, что мы не знаем, что он делает. Я не думаю, что «возвращает число от 0 до 90» очень полезно. Это случайно? Последовательный? Кто знает?

KIKO Software 13.07.2019 12:51

@KIKOSoftware возвращает целое число от 0 до 90. Просто....

Luigi Spezia 13.07.2019 12:56

Тогда почему getNumeroGiocabile() требует аргумента? Если он делает что-то вроде return rand(0, 90);, ему не нужен $previsione в качестве аргумента.

KIKO Software 13.07.2019 13:01

@KIKOSoftware Неважно, что делает функция getNumeroGiocabile(); важна основная функция aggiungiPrevisione()

Luigi Spezia 13.07.2019 13:13

Люди @LuigiSpezia говорят вам, какая информация им нужна, чтобы помочь вам решить вашу проблему, а вы говорите им, что она им не нужна, это не поможет нам / им помочь вам.

John.M 13.07.2019 13:16

@John.M Я даю всю необходимую информацию. Где ты увидел, что я не люблю помощь?

Luigi Spezia 13.07.2019 13:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
9
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, вы ищете что-то вроде этого:

function aggiungiPrevisione($previsione,$pos,$arr_previsioni) 
{
    echo '<br>';

    // if it is the first element of the array
    if ($pos == 1) {
        $arr_previsioni['PREVISIONE1'] = $previsione;
        return $arr_previsioni;
    }

    // Make sure $previsione does not yet exist
    while (in_array($previsione, $arr_previsioni)) {
        $previsione = rand(0, 90);
    } 

    // Add $previsione in array
    $arr_previsioni['PREVISIONE'.$pos] = $previsione; 

    return $arr_previsioni;
}

Обратите внимание, что я изменил только среднюю часть этой функции. У меня есть простой цикл while, проверяющий, находится ли значение $previsione в массиве $arr_previsioni. Если это новое случайное значение от 0 до 90, генерируется для $previsione, и условие цикла проверяется снова, пока значение больше не присутствует в массиве.

Обратите внимание, что эта процедура завершится ошибкой, как только будут использованы все значения от 0 до 90.

Я также не могу исправить все остальные проблемы, такие как:

  • Наличие echo '<br>'; в функции, предназначенной для управления массивом.
  • Наличие ненужных строковых ключей в массиве. Цифровые клавиши по умолчанию, вероятно, подойдут.
  • Неверная процедура инициализации массива.
  • Мне нравится программировать на английском, так как язык программирования английский. Смешение двух языков не поможет другим людям читать ваш код, если только они не итальянцы. Я, кстати, голландец. Уверен, вам не захочется читать голландский код. Вопреки этому ваши комментарии на английском языке. Они были добавлены только для вопроса?

Другие вопросы по теме