0
votes

Construire un tableau associatif à partir de 2 autres tableaux, et lié par une clé commune

Problème:

Je voudrais combiner 2 tableaux associatifs pour en faire un. Pour lier ces tableaux, la clé ID est présente dans les deux.

Entrée:

Pour récupérer mes contacts avec un appel API, je dois faire 2 requêtes : Premier à récupérer les contacts avec identifiant et adresse e-mail Deuxième pour obtenir des informations comme le nom, la ville, etc.

Le premier renvoie un tableau comme celui-ci:

$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"
        )
    );

Le deuxième appel, renvoie un tableau comme

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

Dans $ contactArray , la clé ID correspond à la clé ContactID et à la clé ID dans $contactDataArray

Tentative: Je veux un tableau au format suivant:

$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" => ""
    )
);

J'essaie d'y parvenir avec array_walk, mais sans succès.


5 commentaires

Pouvez-vous publier votre tentative actuelle avec array_walk et quel est le problème? (toute erreur, résultat inattendu, etc.)


Pourquoi avez-vous besoin du premier tableau? semble toutes les données que vous voulez dans le deuxième tableau? Et essayez de partager le code que vous avez essayé ... Avez-vous essayé une simple boucle foreach ?


Le second tableau @dWinder n'a pas d'adresse e-mail


Oh, alors utilisez l'identifiant comme clé dans le premier tableau, puis bouclez et le second et ajoutez-le - pas besoin de array_walk


Je veux extraire l'e-mail et l'identifiant du premier tableau à insérer dans le nouveau tableau avec d'autres clés. Et d'autres clés transformées avec valeur en clé, par exemple le nom de la valeur, deviennent la clé du sous-tableau de valeurs


4 Réponses :


0
votes

Vous pouvez le faire avec 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"];
    }
}

Démo a>.


0 commentaires

0
votes

Pouvez-vous essayer ceci?

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


0
votes

Vous pouvez utiliser array_walk , array_combine , array_column pour le tableau souhaité comme résultat

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