Преобразование многомерного массива в простой массив

#php #arrays #multidimensional-array

#php #массивы #Многомерный-массив

Вопрос:

Я пытаюсь преобразовать многомерный массив в простой массив. Некоторые части моего кода работают, но я теряюсь, когда мне приходится сохранять дочерний массив. Вот основной массив:

 Array
(
    [0] => Array
        (
            [name] => scattr
            [value] => 250
        )

    [1] => Array
        (
            [name] => scattrtel
            [value] => 9830293789
        )

    [2] => Array
        (
            [name] => scattrcolor
            [value] => #2764C6
        )

    [3] => Array
        (
            [name] => scattrta
            [value] => 
        )

    [4] => Array
        (
            [name] => scattrcb
            [value] => 
        )

    [5] => Array
        (
            [name] => scattrmcb[1]
            [value] => 10
        )

    [6] => Array
        (
            [name] => scattrmcb[4]
            [value] => 40
        )

    [7] => Array
        (
            [name] => scattrmrdo
            [value] => 20
        )

    [8] => Array
        (
            [name] => scattrselect
            [value] => 30
        )

    [9] => Array
        (
            [name] => pwpus-shortcode-nonce
            [value] => 028c9426c5
        )

    [10] => Array
        (
            [name] => _wp_http_referer
            [value] => /wp-admin/admin-ajax.php
        )

)  
 

И мой PHP для преобразования его в простой массив:

 $new = array();

foreach ( $datas as $data ) { // $datas as being the multidimensional array.
    $new[$data['name']] = $data['value'];
}
 

Теперь a print_r of $new дает мне:

 Array
(
    [scattr] => 250
    [scattrtel] => 9830293789
    [scattrcolor] => #2764C6
    [scattrta] => gdkwsdghwkdhgk
    [scattrcb] =>
    [scattrmcb[1]] => 10
    [scattrmcb[4]] => 40
    [scattrmrdo] => 20
    [scattrselect] => 30
    [pwpus-shortcode-nonce] => 028c9426c5
    [_wp_http_referer] => /wp-admin/admin-ajax.php
)  
 

Итак, я думаю, что мой код в какой-то степени работает, но не сохраняет его scattrmcb[1] и scattrmcb[4] в массиве. Должно дать что-то вроде этого:

 [scattrmcb] => Array
            (
                [1] => 10
                [4] => 40
            )
 

Как мне это сделать?

Спасибо

Комментарии:

1. Сначала неправильно понял, отредактировал…

2. Полностью в стороне, но data во множественном числе, единственное datum число.

Ответ №1:

Так array_column() вы пройдете большую часть пути. Я использовал регулярное выражение, чтобы получить ключ и индекс внутреннего массива, а затем eval() != evil :

 foreach(array_column($datas, 'value', 'name') as $key => $value) {
    if(preg_match('/(.*)([d ])$/', $key, $match)) {
        eval("$new['{$match[1]}']{$match[2]} = $value;");
    } else {
        $new[$key] = $value;
    }
}
 

Может быть, более или менее читаемый eval() :

         eval('$new["'.$match[1].'"]'.$match[2].' = $value;');
 

Комментарии:

1. OP хочет преобразовать строку scattrmcb[4] в массив, подобный [scattrmcb][4] . Помогает ли ваш код с этим?

2. На самом деле, ваш первый ответ послужил мне лучше. Просто исключил необходимость пары ключ => значение из дочернего массива, и все было хорошо. Спасибо, приятель, это мне очень помогло.

Ответ №2:

Вам нужно больше логики:

 <?php
$datas = [
    ['name'=>'scattr', 'value'=>250],
    ['name'=>'scattrmcb[1]', 'value'=>10],
    ['name'=>'scattrmcb[4]', 'value'=>40]
];

$new = array();

foreach ( $datas as $data ) { // $datas as being the multidimensional array.
    // 'scattrmcb' is special so handle it here
    if(substr($data['name'], 0, 9) === 'scattrmcb'){
        // Set the 'scattrmcb' index
        if(!isset($new[substr($data['name'], 0, 9)])){
            $new[substr($data['name'], 0, 9)] = [];
        }

        // Use preg_replace to set a sub-array to the value between []
        $new[substr($data['name'], 0, 9)][preg_replace("/[^0-9]/", "", $data['name'])] = $data['value'];
    }
    else{
        $new[$data['name']] = $data['value'];
    }
}

print_r($new);