Как объединить 2 строки в многомерном массиве?

#php #arrays

#php #массивы

Вопрос:

У меня многомерный массив. Я хочу объединить 2 строки отдельно для 2 значений массива, и 2 строки не должны быть объединены для одного значения. Я хочу, чтобы CM и PM были объединены 2 раза в любом месте массива. Я пробовал зацикливать массив и генерировать array_rand , но я генерирую только один раз. Любая помощь приветствуется. Ниже приведен один пример того, чего я добиваюсь.

Чего я пытаюсь добиться

  • Объедините строки «PM» и «CM» в одном наборе массива, и одно и то же значение не может быть CM и PM
  • В каждом массиве должны быть объединены PM и CM
  • 1 значение «Name» должно иметь минимум 1 CM и PM и максимум 2 CM и PM

Например: у меня есть приведенный ниже многомерный массив.

 Array
(
    [0] => Array
        (
            [0] => Name-A
            [1] => Name-B
            [2] => Name-C
            [3] => Name-4
            [4] => Name-5
        )

    [1] => Array
        (
            [0] => Name-A
            [1] => Name-B
            [2] => Name-C
            [3] => Name-4
            [4] => Name-5
        )

    [2] => Array
        (
            [0] => Name-A
            [1] => Name-B
            [2] => Name-C
            [3] => Name-4
            [4] => Name-5
        )

    [3] => Array
        (
            [0] => Name-A
            [1] => Name-B
            [2] => Name-C
            [3] => Name-4
            [4] => Name-5
        )

    [4] => Array
        (
            [0] => Name-A
            [1] => Name-B
            [2] => Name-C
            [3] => Name-4
            [4] => Name-5
        )
)
  

После объединения

 Array
(
    [0] => Array
        (
            [0] => Name-A
            [1] => Name-B
            [2] => Name-C["PM"]
            [3] => Name-4["CM"]
            [4] => Name-5
        )

    [1] => Array
        (
            [0] => Name-A
            [1] => Name-B["PM"]
            [2] => Name-C
            [3] => Name-4["CM"]
            [4] => Name-5
        )

    [2] => Array
        (
            [0] => Name-A["PM"]
            [1] => Name-B
            [2] => Name-C
            [3] => Name-4
            [4] => Name-5["CM"]
        )

    [3] => Array
        (
            [0] => Name-A["PM"]
            [1] => Name-B["CM"]
            [2] => Name-C
            [3] => Name-4
            [4] => Name-5
        )

    [4] => Array
        (
            [0] => Name-A
            [1] => Name-B
            [2] => Name-C["CM"]
            [3] => Name-4
            [4] => Name-5["PM"]
        )
)
  

Ответ №1:

Извините, я сначала не понял. Учитывая $your_array:

 // Generate an array where the names are the key, and assign a zero value to PM (0) and CM (1) in a sub array
$ar = array_fill_keys($your_array[0], array (0 => 0, 1 => 0));

//$array the sub_value, $add the case PM ou CM, $exclusion is the key used the first time
function rand_in_array($array, $add, $ar, $exclusion)
{   
    // Select a random key
    $arr_key = array_rand($array, 1);

    
    if($ar[$array[$arr_key]][$add] < 2 amp;amp; ($arr_key !=  $exclusion))
    {
        return $arr_key;
    } 
    return rand_in_array($array, $add, $ar, $exclusion);    
}

for($i=0; $i<count($your_array);$i  ) 
{
    
    $arr_key_pm = rand_in_array($your_array[$i], 0, $ar, 99);
    $ar[$your_array[$i][$arr_key_pm]][0]  ;     
    $arr_key_cm = rand_in_array($your_array[$i], 1, $ar, $arr_key_pm);
    $ar[$your_array[$i][$arr_key_cm]][1]  ;     

    $your_array[$i][$arr_key_pm] .= "PM";
    $your_array[$i][$arr_key_cm] .= "CM";
}
  

Это некрасиво, но работает 🙂
Где-то должен существовать кто-то, способный сделать более эстетичным..

Комментарии:

1. Спасибо за этот код. Этот код работает нормально. Просто нужно одно уточнение.. любая область добавления условия, чтобы убедиться, что каждое имя как минимум 1 CM и PM. Потому что некоторые имена отображаются как 0 для любого CM / PM.

2. Вы могли бы просто заменить 2 на 1 в функции. Если вы измените массив на больший, это может закончиться бесконечным циклом, в котором функция никогда не найдет случай, когда никто никогда не был неназначен. <b> РЕДАКТИРОВАТЬ: это так, не используйте я создаю новый!</b>

3. Но если мы хотим изменить минимальное значение на 2 вместо 1, то в некоторых счетчиках имен содержится только 1. любое решение для этого

4. Если все были один раз PM и один раз CM, в предоставленном вами массиве нет места для того, чтобы кто-то выбирался дважды.

Ответ №2:

 for($i=0; $i<count($your_array);$i  ) 
{
    $arr_keys = array_rand($your_array[$i], 2);
    $your_array[$i][$arr_keys[0]] .= "PM";
    $your_array[$i][$arr_keys[1]] .= "CM";
}
  

Должен выполнить работу.

Комментарии:

1. Это не работает .. Несколько раз PM CM приходит для одного имени, и человек становится PM CM много раз, когда максимально они могут стать CM, а PM равен 2.

Ответ №3:

Я предполагаю, что ваш внутренний индекс массива начинается с нуля. Итак, сгенерируйте случайный индекс от 0 до вашего (inner_array_size — 1). Затем присвойте значение в ссылочной переменной массива в рамках цикла.

 foreach ($arr as amp;$value) {
    $randomIndex = array_rand(range(0, (count($value) -1) ), 2);
    $value[$randomIndex[0]] .= ' ["CM"]'; 
    $value[$randomIndex[1]] .= ' ["PM"]'; 
}