невозможно преобразовать многомерный массив в единый массив php - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь преобразовать многомерный массив php в единственный массив ... но у меня возникают трудности с этим. Мой ввод такой:

array ( 0 => array ('id' => 3,
'text' => 'Name 3',
'children' => 
array (
  0 => 
  array (
    'id' => 4,
    'text' => 'Name 4',
    'children' => 
    array (
      0 => 
      array (
        'id' => 5,
        'text' => 'Name 5',
        'children' => 
        array (
          0 => 
          array (
            'id' => 6,
            'text' => 'Name 6',
          ),
        ),
      ),
    ),
  ),
  1 => 
  array (
    'id' => 7,
    'text' => 'name 7',
  ),
),),)

, и мой ожидаемый результат выглядит следующим образом:

array(3=>'Name 3', 4=>'name 4', 5=>'name 5', 6=>'name 6', 7=>'name 7')

Я пробовал до сих пор следующее:

function nestedToSingle($array)
{
    $singleDimArray = [];

    foreach ($array as $item) {

        if (is_array($item)) {

            $singleDimArray = array_merge($singleDimArray, nestedToSingle($item));
        } else {
            $singleDimArray[] = $item;
        }
    }

    return $singleDimArray;
}

но он дает мне такой вывод:

array ( 0 => 3, 1 => 'name 3',  2 => 4,  3 => 'Name 4',  4 => 5,  5 => 'name 5',  6 => 6,  7 => 'name 6',  8 => 7,  9 => 'name 7',)

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Для этого можно использовать array_walk_recursive. Его функция обратного вызова принимает ключ и значение каждого листового узла в структуре. Просто проверьте наличие «текстового» ключа и соберите все совпадающие значения.

$names = [];
array_walk_recursive($input, function($value, $key) use (&$names) {
    $key == 'text' && $names[] = $value;
});

use (&$names) необходимо для помещения массива $names в область действия функции.

0 голосов
/ 09 июля 2020

Прямо сейчас ваш цикл, пока вы не найдете значение, не являющееся массивом, и не запишите его в свой singleDimArray. И поскольку вы специально не устанавливаете ключ, он получает числовой ключ по умолчанию с приращением. Таким образом, каждое значение, не являющееся массивом, регистрируется отдельно.

Попробуйте следующее, где вы устанавливаете singleDimArray в качестве переменной c, чтобы вы могли продолжать добавлять к нему каждый раз, когда вы вызываете функцию для следующего вложенного массив:

function nestedToSingle( $array )
{
    static $singleDimArray = [];
    
    foreach ( $array as $item ) {

        if ( is_array( $item ) ) {
            if ( array_key_exists( 'id', $item ) && array_key_exists( 'text', $item ) ) {
                $singleDimArray[$item['id']] = $item['text'];
            } 
            if ( array_key_exists( 'children', $item ) && is_array( $item['children'] ) ) {
                nestedToSingle( $item['children'] );
            }
        } 
    }

    return $singleDimArray;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...