Если бы это был мой проект, это то, что я бы сделал и почему ...
- Вам необходимо хранить каждое подмножество данных отдельно друг от друга, поэтому используйте
$temp
в качестве временного хранилища между итерациями внешнего цикла. Временный массив должен быть сброшен в начале каждого нового $set
, а данные временного массива должны быть перенесены в массив $result
для поддержки индексов исходного набора.
explode()
лучше всего указывать в качестве разделителя «запятая» - это исключает необходимость вызывать какие-либо дополнительные функции, чтобы убрать оставшиеся пробелы.
- Поскольку ваши старые и новые ключи известны и статичны, жесткое кодирование ассоциативного массива «перевода» избавит от большого количества повторных вызовов функций и в значительной степени сократит разрастание кода. Я также утверждаю, что это дает вам более простой контроль над подготовкой ключа, и будущие разработчики быстро смогут понять, что делает ваш код.
Код: ( Демо )
$json = '[
{"Contact name(s)": "Person 1, Person 2", "Contact title(s)": "Head Comacho, Other Guy", "Contact email(s)": "email1@email.net, email@email.com", "Contact phone": "123-456-7890, 789-456-1230"},
{"Contact name(s)": "Some Dude", "Contact title(s)": "Cool Title", "Contact email(s)": "things@email.com", "Contact phone": "555-555-5555"},
{"Contact name(s)": "", "Contact title(s)": "", "Contact email(s)": "", "Contact phone": ""}
]';
$array = json_decode($json, true);
$trans = [
"Contact name(s)" => "contact_name",
"Contact title(s)" => "contact_title",
"Contact email(s)" => "contact_email",
"Contact phone" => "contact_phone"
];
foreach ($array as $set) {
$temp = [];
foreach ($set as $key => $data) {
foreach (explode(', ', $data) as $index => $value) {
$temp[$index][$trans[$key]] = $value;
}
}
$result[] = $temp;
}
var_export($result);
Выход:
array (
0 =>
array (
0 =>
array (
'contact_name' => 'Person 1',
'contact_title' => 'Head Comacho',
'contact_email' => 'email1@email.net',
'contact_phone' => '123-456-7890',
),
1 =>
array (
'contact_name' => 'Person 2',
'contact_title' => 'Other Guy',
'contact_email' => 'email@email.com',
'contact_phone' => '789-456-1230',
),
),
1 =>
array (
0 =>
array (
'contact_name' => 'Some Dude',
'contact_title' => 'Cool Title',
'contact_email' => 'things@email.com',
'contact_phone' => '555-555-5555',
),
),
2 =>
array (
0 =>
array (
'contact_name' => '',
'contact_title' => '',
'contact_email' => '',
'contact_phone' => '',
),
),
)
Вы обнаружите, что это решение не просто лаконично, точно и легко читается; это также очень эффективно, потому что во всем процессе есть только один повторный вызов функции (explode()
).