многомерный массив хранит каждый массив списка внутри другого массива

У меня есть вложенные многомерные массивы, которые могут иметь глубину 2 или 3 уровня. Внутри него у меня может быть или не быть массив списка. Мне нужно перебрать массив:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => cat_name_1
            [list] => Array
                (
                    [1] => swgdgbdg
                    [2] => xcbcxb
                )

        )

    [1] => Array
        (
            [id] => 3
            [name] => cat_name_3
            [list] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [name] => cat_name_1
                            [list] => Array
                                (
                                    [1] => 543h54h
                                    [2] => 54hrhhfr2
                                )

                        )

                    [1] => Array
                        (
                            [id] => 2
                            [name] => cat_name_2
                            [list] => Array
                                (
                                    [1] => eherfherh
                                    [2] => 4564642
                                )

                        )

                    [2] => Array
                        (
                            [1] => erggb45yt
                            [2] => jyuk768k
                        )

                    [3] => Array
                        (
                            [1] => sdgsdgsdg
                            [2] => 4tg34g34g
                        )

                )

        )

и сохраните следующее в другом массиве:

        array (
  0 => array ( 
      [1] => swgdgbdg
      [2] => xcbcxb
  ) ,
  1 => array(
      [1] => 543h54h
      [2] => 54hrhhfr2
  ) ,
  2 => array(
      [1] => eherfherh
      [2] => 4564642
  ),
  3 => array(
     [1] => erggb45yt
     [2] => jyuk768k
  ),
  4 => array(
     [1] => sdgsdgsdg
     [2] => 4tg34g34g
  )

);

person shlomicohen    schedule 14.06.2017    source источник
comment
Мы здесь не для того, чтобы решать вашу домашнюю работу!!! Что вы пробовали?   -  person Shubham Agrawal    schedule 14.06.2017
comment
я бы хотел, чтобы это была моя домашняя работа, я попробовал foreach и isset, и я не могу заставить ее работать   -  person shlomicohen    schedule 14.06.2017
comment
попробуй тоже рекурсию   -  person Shubham Agrawal    schedule 14.06.2017
comment
Похоже, эти данные извлекаются из какой-то базы данных. Возможно, лучшим решением было бы нормализовать данные (сделать все данные отформатированными одинаково)   -  person    schedule 14.06.2017
comment
я не могу использовать json из другого источника   -  person shlomicohen    schedule 14.06.2017


Ответы (2)


Вы можете использовать array_walk_recursive(), чтобы получить ключ 1,2 и не являться элементом массива, например, проверьте вживую демо здесь.

$result = [];
$temp = [];
array_walk_recursive($array, function($v, $k) use(&$result, &$temp){
if($k == 1)
  $temp[$k] = $v;
if($k == 2)
{
  $temp[$k] = $v;
  $result[] = $temp;
}
});
print_r($result);

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

Расширьте функцию array_walk_recursive() третьим параметром для функции вызова, чтобы указать, находится ли она в начале подмассива.

$result = [];
$temp = [];
$length = 0;
uarray_walk_recursive($array, function($v, $k, $f) use(&$result, &$temp, &$length){
if(is_numeric($k)) {
  if($f && $length != 0) {
    $result[] = $temp;
    $length = 0;
    $temp = [];
  }
  $temp[$k] = $v;
  $length++;
}
});
$result[] = $temp;
print_r($result);


function uarray_walk_recursive(&$input, $funcname)
{
    if (!is_callable($funcname)) {
        if (is_array($funcname)) {
            $funcname = $funcname[0] . '::' . $funcname[1];
        }
        user_error('uarray_walk_recursive() Not a valid callback ' . $user_func,
            E_USER_WARNING);
        return;
    }

    if (!is_array($input)) {
        user_error('uarray_walk_recursive() The argument should be an array',
            E_USER_WARNING);
        return;
    }

    $args = func_get_args();
    $flag = true;

    foreach ($input as $key => $item) {
        if (is_array($item)) {
            $args[2] = false;
            $flag = true;
            uarray_walk_recursive($item, $funcname, $args);
            $input[$key] = $item;
        } else {

            $args[2] = $flag;
            $flag = false;
            $args[0] = &$item;
            $args[1] = &$key;
            call_user_func_array($funcname, $args);
            $input[$key] = $item;
        }
    }
}
person LF00    schedule 14.06.2017
comment
спасибо, но у меня может быть 10 массивов внутри массива, а не только 3, и это случайный порядок, у меня может быть массив на 4 позиции, а в другом массиве он может быть на 8 позиции. - person shlomicohen; 14.06.2017
comment
@shlomicohen array_work_recursive() - это рекурсивная функция. Также работает для вашей 10 ситуации. - person LF00; 14.06.2017
comment
но у меня может быть массив nasted в 4 или 8 позициях, а не только 1-2 - person shlomicohen; 14.06.2017
comment
если длина фиксирована, например, (1-n), достаточно небольшой модификации. - person LF00; 14.06.2017
comment
не исправлено, у меня есть 60 массивов внутри основного массива, и каждый из них представляет собой массив nustetd со случайной длиной - person shlomicohen; 14.06.2017
comment
@shlomicohen, вы можете проверить это сейчас - person LF00; 14.06.2017
comment
спасибо! но он работает только тогда, когда массив с массивом внутри является 1-й позицией, он может быть на любой позиции - person shlomicohen; 14.06.2017
comment
@shlomicohen, теперь вы можете проверить мой ответ. - person LF00; 14.06.2017
comment
@KrisRoofe Ты гений!! Я узнал что-то новое для себя в php. Поскольку логика, которую вы использовали, была за пределами моего понимания, теперь у меня есть еще одна логика в коллекции. ;) Это поможет мне в будущем!. Спасибо (у) - person Parag Soni; 14.06.2017
comment
@shlomicohen вам нужно сделать домашнее задание, если вы не знаете, как использовать мой код. Просто заплатите немного усилий, вы запустите его. Извините, я больше не могу для вас. - person LF00; 14.06.2017

Псевдокод

function getSomething(var arr)
{
   flag = 0;
   output = []
    for( i = 0 to arr.length)
    {
      check arr[i] is array, 
      if yes,then  flag = 1 and output.add(getSomething(arr[i]))
      if not, continue 
    }
  if flag =0,then return arr
  else return output;
}
person Shubham Agrawal    schedule 14.06.2017
comment
@shlomicohen, вам нужно просто заменить псевдокод некоторыми функциями - person Shubham Agrawal; 14.06.2017
comment
как я могу запустить его? - person shlomicohen; 14.06.2017
comment
эй @shlomicohen, просто напиши код с этой логикой - person Shubham Agrawal; 14.06.2017