Создайте ассоциативный массив из 2 других массивов, связанных общим ключом - PullRequest
0 голосов
/ 03 мая 2019

Проблема:

Я хотел бы объединить 2 ассоциативных массива в один.Чтобы связать эти массивы, идентификационный ключ присутствует в обоих.

Ввод:

Чтобы получить мои контакты с помощью вызова API, мне нужно сделать 2 запроса:восстановить контакты с помощью идентификатора и адреса электронной почты. Second, чтобы получить некоторую информацию, такую ​​как имя, город и т. д.

Первый возвращает массив, подобный следующему:

$contactArray = array(
    array(
        "CreatedAt" => "2019-04-12T11:53:26Z",
        "DeliveredCount" => 0,
        "Email" => "terry@example.org",
        "ExclusionFromCampaignsUpdatedAt" => "2019-04-28T09:21:35Z",
        "ID" => 1864410583,
        "IsExcludedFromCampaigns" => false,
        "IsOptInPending" => false,
        "IsSpamComplaining" => false,
        "LastActivityAt" => "2019-04-28T09:21:35Z",
        "LastUpdateAt" => "2019-04-28T09:21:35Z",
        "Name" => "",
        "UnsubscribedAt" => "",
        "UnsubscribedBy" => ""
    ),
    array(
        "CreatedAt" => "2019-04-12T12:39:30Z",
        "DeliveredCount" => 0,
        "Email" => "duane@example.org",
        "ExclusionFromCampaignsUpdatedAt" => "",
        "ID" => 1864410588,
        "IsExcludedFromCampaigns" => false,
        "IsOptInPending" => false,
        "IsSpamComplaining" => false,
        "LastActivityAt" => "2019-04-12T12:39:30Z",
        "LastUpdateAt" => "2019-04-12T12:39:30Z",
        "Name" => "",
        "UnsubscribedAt" => "",
        "UnsubscribedBy" => ""
    )
);

Второй вызов возвращает массивкак

$contactDataArray =
        array(
            array(
                "ContactID" => 1864410583,
                "Data" => array(
                    array(
                        "Name" => "firstname",
                        "Value" => "Mark"
                    ),
                    array(
                        "Name" => "city",
                        "Value" => "Miami"
                    ),
                    array(
                        "Name" => "name",
                        "Value" => "Terry"
                    ),
                    array(
                        "Name" => "phone",
                        "Value" => "555-5555"
                    )
                ),
                "ID" => 1864410583
            ),
            array(
                "ContactID" => 1864410588,
                "Data" => array(
                    array(
                        "Name" => "firstname",
                        "Value" => "Jane"
                    ),
                    array(
                        "Name" => "city",
                        "Value" => "New York"
                    ),
                    array(
                        "Name" => "name",
                        "Value" => "Duane"
                    ),
                    array(
                        "Name" => "phone",
                        "Value" => "555-5555"
                    )
                ),
                "ID" => 1864410588
            )
        );

В $contactArray ключ идентификатора совпадает с ключом ContactID и ключом идентификатора в $contactDataArray

Попытка: Мне нужен массив, отформатированный следующим образом:

$output = array(
        array(
            "Email" => "terry@example.org",
            "ID" => 1864410583,
            "firstname" => "Mark",
            "city" => "Miami",
            "name" => "Terry",
            "phone" => "555-5555"
        ),
        array(
            "Email" => "duane@example.org",
            "ID" => 1864410588,
            "firstname" => "Jane",
            "city" => "New York",
            "name" => "Duane",
            "phone" => "555-5555"
        )
    );

Я пытаюсь добиться этого с помощью array_walk, но безуспешно.

Ответы [ 4 ]

0 голосов
/ 03 мая 2019

Вы можете использовать array_walk, array_combine, array_column для нужного массива в результате

$res = [];
array_walk($contactArray, function($v, $k) use ($contactDataArray,&$res)
{
  $res[] = array_merge(['Email'=>$v['Email'],'ID'=>$v['ID']],
            array_combine(
                array_column($contactDataArray[$k]['Data'],'Name'),
                array_column($contactDataArray[$k]['Data'],'Value')
            )
   );
});
echo '<pre>';
print_r($res);

DEMO

0 голосов
/ 03 мая 2019

Можете ли вы попробовать это?

$output = [];
for($i = 0; $i < count($contactDataArray); $i++) {
    $arrIDandEmail = [
        'Email' => isset($contactArray[$i]['Email']) ? $contactArray[$i]['Email'] : '', 
        'ID' => isset($contactDataArray[$i]['ID']) ? $contactDataArray[$i]['ID'] : ''
    ];
    $arrData = array_column($contactDataArray[$i]["Data"], "Value", "Name");
    $newArray = array_merge($arrIDandEmail, $arrData);
    $output[] = $newArray;
}
0 голосов
/ 03 мая 2019

Для PHP> = 7.1 вы можете использовать деструктуризацию массива, используя list ()

<?php 

$output = [];

foreach ($contactDataArray as [
    'ID' => $id,
    'Data' => [
        ['Name' => $firstnameKey, 'Value' => $firstnameValue],
        ['Name' => $cityKey, 'Value' => $cityValue],
        ['Name' => $nameKey, 'Value' => $nameValue],
        ['Name' => $phoneKey, 'Value' => $phoneValue]
    ]
]) {
    $output[] = [
        "Email" => $contactArray[array_search($id, array_column($contactArray, 'ID'))]['Email'],
        "ID" => $id,
        $firstnameKey => $firstnameValue,
        $cityKey => $cityValue,
        $nameKey => $nameValue,
        $phoneKey => $phoneValue
    ];
}

var_dump($output);

Demo

0 голосов
/ 03 мая 2019

Вы можете сделать это с помощью foreach,

$result = [];
foreach ($contactDataArray as $key => $value) {
    $ids   = array_column($contactArray, "ID"); // fetching all values from contactArray
    if (!empty(array_intersect([$value['ContactID'], $value['ID']], $ids))) { // checking if both satisfy the condition
        $result[$key] = array_column($value['Data'], 'Value', 'Name'); // combining name and value
        // searchng for key with matched ContactID
        $result[$key]['Email'] = $contactArray[array_search($value["ContactID"], $ids)]['Email'];
        $result[$key]['ID'] = $value["ContactID"];
    }
}

Демо .

...