Я получил этот массив:
**Array 1 Example:**
Array
(
[0] => 62
[1] => 9
[2] => Array
(
[0] => 5
[1] => 16
[2] => 45
)
[3] => Array
(
[0] => 11
[1] => 21
[2] => 25
[3] => 32
[4] => 50
)
[4] => Array
(
[0] => 4
[1] => 23
[2] => 37
[3] => 57
)
[5] => Array
(
[0] => 13
[1] => 15
[2] => 18
[3] => 22
[4] => 27
[5] => 30
)
)
Моя проблема в том, что я не могу получить случайное значение из #Array 1 Example. Поэтому я попытался собрать все значения в новом массиве, поэтому он будет выглядеть как #Array 2 Example, но сделать этот массив кажется почти невозможным для меня.
**Array 2 Example:**
Array
(
[0] => 62
[1] => 56
[2] => 16
[3] => 44
[4] => 54
[5] => 11
[6] => 21
[7] => 25
[8] => 32
[9] => 33
[10] => 4
[11] => 12
[12] => 23
[13] => 57
[14] => 13
[15] => 15
[16] => 18
[17] => 22
[18] => 27
[19] => 30
)
Я пробовал все виды кода, но я не могу заставить работать.
Какие-либо предложения?
Благодарю!
Используйте is_array()
внутри функции foreach()
чтобы проверять и циклировать внутри внутреннего массива.
foreach($array as $piece) {
if(is_array($piece){
foreach($piece as $item)
$newarray[] = $item;
} else {
$newarray[] = $piece;
}
}
$newarray[]
содержит все элементы, необходимые для выполнения rand. Это должно решить вашу проблему.
Вы можете использовать простой рекурсивный итератор и простой рандомизированный класс возвращаемого значения:
class Randomizer
{
public static $new;
// Recursive iterator that stores array values in the $new variable
public static function Combine($array = array()) {
foreach($array as $key => $value) {
if(!is_array($value)) {
self::$new[] = $value;
}
else
self::Combine($value);
}
return self::$new;
}
// Returns a randomized value
public static function Fetch($arr)
{
// Depending on needs, you could easily
// add shuffle, or other array functions
// otherwise you can just skip this method/function
$val = array_rand($arr);
return $val;
}
}
// If you had more advanced functions in the Fetch() class use this way
$test = Randomizer::Fetch(Randomizer::Combine($array));
// Or simply use
$test = array_rand(Randomizer::Combine($array));
print_r($test);
Вы можете использовать рекурсивную функцию
function compress_arr($arr, &$new_arr){
foreach($arr as $val){
if(is_array($val)){
compress_arr($val, $new_arr);
} else {
$new_arr[] = $val;
}
}
}
$arr_n = array();
compress_arr($array, $arr_n);
Обратите внимание, что эта функция не использует return, поскольку я передаю по ссылке массив, он изменит переданную переменную.
Остальная логика проста: мы перебираем массив, если это другой массив, то мы вызываем функцию, заставляя ее снова итерации. Пока это значение, мы добавим val в новый массив, переданный ref. Эта функция сжимает в единый массив все, что структурировано как вложенный массив, независимо от размера количества подуровней.
Если вам не нравится пропуск по ссылке, вы можете изменить его на это:
function compress_arr($arr){
$arr_ret = array();
foreach($arr as $val){
if(is_array($val)){
array_merge($arr_ret, compress_arr($val));
} else {
$arr_ret[] = $val;
}
}
return $arr_ret;
}
И теперь, чтобы принять случайное значение в этом массиве, просто используйте функцию array_rand. Это избавит вас от расчета длины с помощью функции rand...
Попробуй это...
$flatarray = array();
foreach($orig_array as $ra)
{
if ( is_array($ra) )
$flatarray = array_merge($flatarray,$ra);
else
array_push($flatarray,$ra);
}
Вы можете использовать RecursiveIteratorIterator, RecursiveArrayIterator и iterator_to_array
Тогда ваш код будет выглядеть так:
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($vals));
$newArray = iterator_to_array($iterator, false);
var_dump($newArray);
и это дает мне этот результат:
array(20) {
[0]=>
int(62)
[1]=>
int(9)
[2]=>
int(5)
[3]=>
int(16)
[4]=>
int(45)
[5]=>
int(11)
[6]=>
int(21)
[7]=>
int(25)
[8]=>
int(32)
[9]=>
int(50)
[10]=>
int(4)
[11]=>
int(23)
[12]=>
int(37)
[13]=>
int(57)
[14]=>
int(13)
[15]=>
int(15)
[16]=>
int(18)
[17]=>
int(22)
[18]=>
int(27)
[19]=>
int(30)
}
Теперь мы можем выбрать случайное значение или значения из массива следующим образом:
$items = array_rand($newArray, 10);
var_dump($items);
Что даст нам эти 10 ключей:
array(10) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
[5]=>
int(7)
[6]=>
int(9)
[7]=>
int(13)
[8]=>
int(14)
[9]=>
int(15)
}
Затем мы можем прокрутить эти ключи и получить эти значения:
int(9)
int(5)
int(16)
int(45)
int(11)
int(25)
int(50)
int(57)
int(13)
int(15)
Таким образом, в конце вы можете использовать этот код:
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($vals));
$newArray = iterator_to_array($iterator, false);
$keys = array_rand($newArray, 10);
foreach($keys as $key){
var_dump($newArray[$key]);
}