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.
4 Réponses :
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"]; } }
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; }
Pour PHP> = 7.1, vous pouvez utiliser la déstructuration des tableaux en utilisant 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);
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);
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