簡體   English   中英

按鍵拆分和分組數組

[英]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);

如果這是我的項目,這就是我要做的事情以及原因...

  1. 您需要將每個數據子集彼此分開,因此請使用$temp作為外部循環迭代之間的臨時存儲。 必須在每個新$set的開始處重置臨時數組,並且必須將臨時數組數據傳輸到$result數組以維護原始的設置索引。
  2. explode()最好用作“逗號空間”作為定界符參數-這樣就不必調用任何其他函數來拖延剩余的空間。
  3. 因為您的舊鍵和新鍵是已知的和靜態的,所以對關聯的“轉換”數組進行硬編碼將節省大量的迭代函數調用,並大大減少了代碼膨脹。 我還將爭辯說,這使您可以更輕松地控制鍵的准備工作,並且將來的開發人員將能夠迅速理解您的代碼在做什么。

代碼:( 演示

$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM