2
votes

Remplacez les clés du tableau par une valeur dans le tableau

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?

php

0 commentaires

4 Réponses :


3
votes

Une simple boucle for peut le faire:

https://3v4l.org / h47MG

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


3 commentaires

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.



3
votes

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


0 commentaires

3
votes

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] =>
            )
        )
    ) 
)

Démo sur 3v4l.org p>

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

Démo sur 3v4l.org


3 commentaires

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



1
votes
<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>

0 commentaires