#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"]';
}