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