[英]Split and group array by keys
好吧,我已經進行了一些搜索,但是還沒有找到答案,所以我將對此進行介紹。
我有一個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
(
[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 Title
[contact_email] => email@email.com
[contact_phone] => 789-456-1230
)
)
Array
(
[0] => Array
(
[contact_name] => Some Dude
[contact_title] => Cool Title
[contact_email] => things@email.com
[contact_phone] => 555-555-5555
)
)
Array
(
[0] => Array
(
[contact_name] =>
[contact_title] =>
[contact_email] =>
[contact_phone] =>
)
)
我能夠將數據轉換為自己的數組,如下所示:
Array
(
[contact_name] => Array
(
[0] => Person 1
[1] => Person 2
)
[contact_title] => Array
(
[0] => Head Comacho
[1] => Other Guy
)
[contact_email] => Array
(
[0] => email1@email.net
[1] => email@email.com
)
[contact_phone] => Array
(
[0] => 123-456-7890
[1] => 789-456-1230
)
)
Array
(
.....etc
)
我將如何像第一個示例一樣獲得它?
抱歉,如果以前已經回答過,我不確定該如何表達我的問題。 任何和所有幫助表示贊賞。
我認為該腳本可以滿足您的需求。 我創建了一個函數split_contacts
,該函數將解碼數組中的每個條目都包含split_contacts
,並將值(例如, "Person 1, Person 2"
=> [“ Person 1”,“ Person 2”])拆分為由對象鍵索引的數組,由preg_replace
按摩成您想要的形式(例如"Contact name(s)" => "contact_name"
)。 請注意,也許可以使用str_replace
而不是preg_replace
,但是我想使代碼在鍵值格式方面保持靈活。
$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": ""
}
]';
$arr = json_decode($json, true);
function split_contact($contact) {
$contacts = array();
foreach ($contact as $key => $values) {
$key = strtolower(preg_replace(array('/\(s\)$/', '/\s+/'), array('', '_'), $key));
foreach (explode(',', $values) as $index => $value) {
$contacts[$index][$key] = trim($value);
}
}
return $contacts;
}
$newarr = array();
foreach ($arr as $contact) {
$newarr[] = split_contact($contact);
}
print_r($newarr);
輸出:
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] =>
)
)
)
如果您可以確保多個人的json對象始終包含完全相同數量的元素,那么您可以執行以下操作:
<?php
$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": ""}
]';
$jsonA = json_decode($json, true);
$result = [];
$maxLen = 0;
foreach ($jsonA as &$obj) {
foreach ($obj as $k => $v) {
if (!isset($result[$k])) $result[$k] = [];
foreach (explode(',', $v) as $av) $result[$k][] = trim($av);
$maxLen = max($maxLen, count($result[$k]));
}
}
$objects = [];
for ($i=0; $i<$maxLen; $i++) {
$object = [];
foreach (array_keys($result) as $k) $object[$k] = isset($result[$k][$i]) ? $result[$k][$i] : '';
$objects[] = $object;
}
echo '<pre>';
print_r($objects);
它打印:
Array
(
[0] => Array
(
[Contact name(s)] => Person 1
[Contact title(s)] => Head Comacho
[Contact email(s)] => email1@email.net
[Contact phone] => 123-456-7890
)
[1] => Array
(
[Contact name(s)] => Person 2
[Contact title(s)] => Other Guy
[Contact email(s)] => email@email.com
[Contact phone] => 789-456-1230
)
[2] => Array
(
[Contact name(s)] => Some Dude
[Contact title(s)] => Cool Title
[Contact email(s)] => things@email.com
[Contact phone] => 555-555-5555
)
[3] => Array
(
[Contact name(s)] =>
[Contact title(s)] =>
[Contact email(s)] =>
[Contact phone] =>
)
)
我來到這個解決方案:
$arr = '[
{
"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": ""
}
]';
$arr = json_decode($arr, true);
foreach ($arr as $row) {
list($m_name, $m_title, $m_email, $m_phone) =
[explode(',', $row["Contact name(s)"]),explode(',', $row["Contact title(s)"]),
explode(',', $row["Contact email(s)"]),explode(',', $row["Contact phone"])];
foreach (array_keys($m_name) as $per)
$result[] = ['name' => $m_name[$per],'title' => $m_title[$per],
'email' => $m_email[$per],'phone' => $m_phone[$per]];
}
var_dump($result);
如果這是我的項目,這就是我要做的事情以及原因...
$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()
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.