Essayer d'éviter de faire une boucle en dehors du tableau $ data que vous voyez. Comme j'ai besoin de le faire plusieurs fois et que cela a l'air désordonné.
J'ai un tableau similaire à celui-ci:
$data = [
'primary' => [
'address_details' => [],
'contact_details' => [],
'social_links' => [
'facebook' => [
'type_id' => '1',
'url' => ''
],
'twitter' => [
'type_id' => '2',
'url' => ''
]
]
]
];
I j'ai besoin des clés dans mes $ data ['primary'] ['social_links'] pour utiliser $ type ['value'] plutôt que d'être simplement 0, 1, etc. ...
Donc, $ data ressemblerait à:
$links = [
[
'type_id' => '1',
'url' => ''
],
[
'type_id' => '2',
'url' => ''
]
];
$types = [
[
'id' => 1,
'value' => 'facebook'
],
[
'id' => 2
'value' => 'twitter'
]
];
$data = [
'primary' => [
'address_details' => [],
'contact_details' => [],
'social_links' => $links
]
];
Est-il possible de faire cela avec array_map ou quelque chose?
4 Réponses :
Une simple boucle for peut le faire:
<?php
$links = [
[
'type_id' => '1',
'url' => ''
],
[
'type_id' => '2',
'url' => ''
]
];
$types = [
[
'value' => 'facebook'
],
[
'value' => 'twitter'
]
];
$result = [];
for($i = 0, $len = count($types); $i < $len; $i++) {
$result[$types[$i]['value']] = $links[$i];
}
$data = [
'primary' => [
'address_details' => [],
'contact_details' => [],
'social_links' => $result
]
];
var_dump($data);
J'essayais d'éviter de faire une boucle en dehors du tableau $ data que vous voyez. Comme j'ai besoin de le faire plusieurs fois et ça a l'air désordonné.
@AdamWhateverson Je ne comprends pas ce que vous voulez dire. Il crée un nouveau tableau $ result et ajoute une nouvelle clé (valeur de $ types) => valeur (entrée de $ links) au tableau $ result. $ result [] = .. les ajouterait sans clé (c'est-à-dire zéro, un ... indexé) ce qui n'est pas ce qu'OP a écrit dans son exemple de sortie
@Xatenev Bonjour, ignorez-moi, j'ai mal lu le code, ça va :) C'est bizarre comment vous avez voté ici juste pour avoir essayé de discuter. Bonne journée.
Vous pouvez utiliser une boucle pour modifier le tableau directement:
array_combine(array_column($types, 'value'), $links)
Sortie:
["facebook"]=> array(2) {
["type_id"]=> string(1) "1"
["url"]=> string(0) ""
}
["twitter"]=> array(2) {
["type_id"]=> string(1) "2"
["url"]=> string(0) ""
}
Ou en utilisant array_combine si vous ne voulez pas de boucle, par votre commentaire sur une autre réponse:
for($i=0; $i < sizeof($links); $i++) {
$links[$types[$i]['value']] = $links[$i];
unset($links[$i]);
}
var_dump($links);
Vous pouvez simplement utiliser array_combine a > avec la sortie de la colonne value de $ types (générée à l'aide de array_column ) sous forme de clés et les valeurs de $links:
$data = [
'primary' => [
'address_details' => [],
'contact_details' => [],
'social_links' => array_map(function ($v) use ($links) { return $links[array_search($v, array_column($links, 'type_id'))]; }, array_column($types, 'id', 'value'))
]
];
Sortie:
Array (
[primary] => Array (
[address_details] => Array ( )
[contact_details] => Array ( )
[social_links] => Array (
[facebook] => Array (
[type_id] => 1
[url] =>
)
[twitter] => Array (
[type_id] => 2
[url] =>
)
)
)
)
Mise à jour
Sur la base de la question de modification des OP, les choses deviennent beaucoup plus compliquées pour donner une solution en une ligne. Cela devrait fonctionner:
$data = [
'primary' => [
'address_details' => [],
'contact_details' => [],
'social_links' => array_combine(array_column($types, 'value'), $links)
]
];
print_r($data);
Mon erreur sur mon exemple, mais le $ types ['value'] serait la clé, mais je sélectionne le $ type en utilisant son id , a mis à jour mon exemple. Votre code ci-dessus peut-il être adapté pour fonctionner encore?
@MartynBall donc la valeur id de $ types est censée correspondre à la valeur type_id de $ links ?
@MartynBall J'ai ajouté une mise à jour à ma réponse. C'est un peu brouillon mais c'est toujours un one-liner ...
<pre><code>
$social_links = [];
foreach ($types as $type):
$social_links[$type['value']] = $links[$key];
endforeach;
$data = [
'primary' => [
'address_details' => [],
'contact_details' => [],
'social_links' => $social_links
]
];
print_r($data);
</code></pre>