php array_rand многомерное значение

0

Я получил этот массив:

**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
        )

Я пробовал все виды кода, но я не могу заставить работать.

Какие-либо предложения?

Благодарю!

Теги:
arrays
multidimensional-array
random

5 ответов

1

Используйте is_array() внутри функции foreach() чтобы проверять и циклировать внутри внутреннего массива.

foreach($array as $piece) {
    if(is_array($piece){
        foreach($piece as $item)
            $newarray[] = $item;
    } else {
        $newarray[] = $piece;
    }
}

$newarray[] содержит все элементы, необходимые для выполнения rand. Это должно решить вашу проблему.

0

Вы можете использовать простой рекурсивный итератор и простой рандомизированный класс возвращаемого значения:

    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);
0

Вы можете использовать рекурсивную функцию

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...

0

Попробуй это...

$flatarray = array();
foreach($orig_array as $ra)
{
   if ( is_array($ra) )
      $flatarray = array_merge($flatarray,$ra);
   else   
      array_push($flatarray,$ra);
}
0

Вы можете использовать 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]);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню