Свести многомерный массив к заданному индексу c - PullRequest
0 голосов
/ 29 марта 2020

Я хотел бы сгладить или каким-либо другим способом добиться желаемой структуры массива.

в данный момент мой массив выглядит так:

    $list = array(
    'ind' => array(
        'messagetype' => 'Alert',
        'visibility' => 'Public',
        'info' => array(
            0 => array(
                'urgency' => 'Urgent',
                'params' => array(
                    0 => array(
                        'Name' => 'display',
                        'value' => '3; top',
                    ),
                    1 => array(
                        'Name' => 'level',
                        'value' => '1; blue',
                    ),
                ),
                'area' => array(
                    'ard' => 'Bob',
                    'code' => array(
                        0 => array(
                            'Name' => 'Badge',
                            'value' => 'GSSD154',
                        ),
                    ),
                ),
            ),
            1 => array(
                'urgency' => 'Minor',
                'params' => array(
                    0 => array(
                        'Name' => 'display',
                        'value' => '1; left',
                    ),
                    1 => array(
                        'Name' => 'level',
                        'value' => '1; red',
                    ),
                ),
                'area' => array(
                    'ard' => 'Bob',
                    'code' => array(
                        0 => array(
                            'Name' => 'Badge',
                            'value' => 'GBECS23',
                        ),
                    ),
                ),

            ),
        ),
    ),
);

Я хотел бы получить его просто сглаживая таким образом или каким-либо другим методом, чтобы получить такой вид вывода, который в основном аналогичен сглаживанию функций, поэтому в основном просто перемещает дочерние элементы на один уровень и переименовывает их с помощью «.» dots.

    $list = array(
    'ind' => array(
        'messagetype' => 'Alert',
        'visibility' => 'Public',
        'info' => array(
            0 => array(
                'urgency' => 'Urgent',
                'params.0.Name' => 'display',
                'params.0.value' => '3; top',
                'params.1.Name' => 'level',
                'params.1.value' => '1; blue',
                'area.ard' => 'Bob',
                'area.code.0.Name' => 'Badge',
                'area.code.0.Value' => 'GSSD154',

            ),

            1 => array(
                'urgency' => 'Minor',
                'params.0.Name' => 'display',
                'params.0.value' => '1; left',
                'params.1.Name' => 'level',
                'params.1.value' => '1; red',
                'area.ard' => 'Bob',
                'area.code.0.Name' => 'Badge',
                'area.code.0.Value' => 'GBECS23',

            ),
        ),
    ),
);
?>

Мне нужно сохранить ключи info => 0, ключи, содержащие параметры => Name должен содержать некоторый идентификатор, поэтому в данном случае проще всего сохранить ключ, который есть почти во всех случаи [0] [1], но в некоторых [0] [1] [2]. Где находится ключ, для меня это не имеет большого значения.

Я перепробовал все, что смог найти в inte rnet, но я просто не мог найти хороший эффект, чтобы соответствовать этому.

со следующим кодом:

    function makeNonNestedRecursive(array &$out, $key, array $in) {
    foreach ($in as $k => $v) {
        if (is_array($v)) {
            makeNonNestedRecursive($out, $key . $k . '.', $v);
        } else {
            $out[$key . $k] = $v;
        }
    }
}

function makeNonNested(array $in) {
    $out = array();
    makeNonNestedRecursive($out, '', $in);
    return $out;
}
//$fooCompressed = makeNonNested($list);
echo "<pre>";
print_r($list);

Вывод

Array
(
    [ind.messagetype] => Alert
    [ind.visibility] => Public
    [ind.info.0.urgency] => Urgent
    [ind.info.0.params.0.Name] => display
    [ind.info.0.params.0.value] => 3; top
    [ind.info.0.params.1.Name] => level
    [ind.info.0.params.1.value] => 1; blue
    [ind.info.0.area.ard] => Bob
    [ind.info.0.area.code.0.Name] => Badge
    [ind.info.0.area.code.0.value] => GSSD154
    [ind.info.1.urgency] => Minor
    [ind.info.1.params.0.Name] => display
    [ind.info.1.params.0.value] => 1; left
    [ind.info.1.params.1.Name] => level
    [ind.info.1.params.1.value] => 1; red
    [ind.info.1.area.ard] => Bob
    [ind.info.1.area.code.0.Name] => Badge
    [ind.info.1.area.code.0.value] => GBECS23
)

Мне просто нужно, чтобы он не обрабатывал информацию [num] и сохранял это значение для дальнейших операций.

Спасибо за помощь в пересылке.

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Дайте человеку огонь, и он согреет на весь день. Но подожгите его, и он останется теплым до конца своей жизни.

Я специально представляю вам очень базовый c уровень пример ( "огонь" ), чтобы вы могли изменить его, чтобы удалить дубликаты, добавить дополнительные элементы управления и так далее. чтобы улучшить свои базовые навыки c PHP ( "тепло дня" ). Вы можете легко уменьшить его до половины размера! Есть вспомогательные классы и др. c. там, но сначала попробуйте сделать это самостоятельно.

$result = [];
$result['ind']['messagetype'] = $list['ind']['messagetype'];
$result['ind']['visibility'] = $list['ind']['visibility'];

$lines = [];
foreach ($list['ind']['info'] as $k => $v) {
    if (is_array($v)) {
        $lines[$k]['urgency'] = $v['urgency'];
        if (is_array($v['params'])) {
            foreach ($v['params'] as $kp => $vp) {
                if (is_array($vp)) {
                    foreach ($vp as $kpi => $vpi) {
                        $lines[$k]['params.'.$kp.'.'.$kpi] = $vpi;
                    }
                }
            }
        }

        if (is_array($v['area'])) {
            foreach ($v['area'] as $kp => $vp) {
                if (is_array($vp)) {
                    foreach ($vp as $kpi => $vpi) {
                        if (is_array($vpi)) {
                            foreach ($vpi as $kpid => $vpid) {
                                $lines[$k]['area.'.$kp.'.'.$kpi.'.'.$kpid] = $vpid;
                            }
                        }
                    }
                } else {
                    $lines[$k]['area.'.$kp] = $vp;
                }
            }
        }
    }
}
$result['ind']['info'] = $lines;

print_r($result);
Array
(
    [ind] => Array
        (
            [messagetype] => Alert
            [visibility] => Public
            [info] => Array
                (
                    [0] => Array
                        (
                            [urgency] => Urgent
                            [params.0.Name] => display
                            [params.0.value] => 3; top
                            [params.1.Name] => level
                            [params.1.value] => 1; blue
                            [area.ard] => Bob
                            [area.code.0.Name] => Badge
                            [area.code.0.value] => GSSD154
                        )
                    [1] => Array
                        (
                            [urgency] => Minor
                            [params.0.Name] => display
                            [params.0.value] => 1; left
                            [params.1.Name] => level
                            [params.1.value] => 1; red
                            [area.ard] => Bob
                            [area.code.0.Name] => Badge
                            [area.code.0.value] => GBECS23
                        )
                )
        )
)
0 голосов
/ 29 марта 2020

Не знаю, правильно ли я понимаю вашу проблему. Вы можете сгладить подмассив $ list ['ind'] ['info']. Я использую этот класс tableArray () , чтобы показать результат.

$data = tableArray::create($list['ind']['info'])
  ->flatten()
  ->fetchAll()
;

//test output
echo '<pre>';
var_export($data);

Результат:

array (
  0 => 
  array (
    'urgency' => 'Urgent',
    'params.0.Name' => 'display',
    'params.0.value' => '3; top',
    'params.1.Name' => 'level',
    'params.1.value' => '1; blue',
    'area.ard' => 'Bob',
    'area.code.0.Name' => 'Badge',
    'area.code.0.value' => 'GSSD154',
  ),
  1 => 
  array (
    'urgency' => 'Minor',
    'params.0.Name' => 'display',
    'params.0.value' => '1; left',
    'params.1.Name' => 'level',
    'params.1.value' => '1; red',
    'area.ard' => 'Bob',
    'area.code.0.Name' => 'Badge',
    'area.code.0.value' => 'GBECS23',
  ),
) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...