2017-08-15 1 views
0

J'ai la prochaine gammetableau de reformater sans variable température

[ 
    ['id' => 30, 'count' => 3], 
    ['id' => 45, 'count' => 7] 
] 

je besoin d'être

[ 
    30 => ['count' => 3], 
    45 => ['count' => 7] 
] 

Ce que j'ai

$formatted = []; 
foreach ($services as $service) { 
    $formatted[$service['id']] = [ 
     'count' => $service['count'] 
    ]; 
} 

Ce que je voudrais est un plus solution élégante sans la variable $ formatée temporaire. Merci!

Mise à jour. Merci beaucoup @rtrigoso! Avec la collection Laravel, mon code ressemble à côté

$services->reduce(function ($carry, $item) { 
     $carry[$item['id']] = ['count' => $item['count']]; 
     return $carry; 
    }); 
+3

Pourquoi si? Si vous n'utilisez pas une troisième variable et mettez directement à jour le tableau principal ... Vous risquez de remplacer les index. Par exemple, si vous avez un ID 30, mais que vous avez également un élément à l'index 30, il l'écrase lorsque vous définissez l'ID. –

+0

Juste sentir qu'il devrait y avoir une façon plus élégante et juste de le faire. Quelque chose comme $ formatted = array_magic ($ array, 'id') – cleverketchup

Répondre

2

Vous pouvez utiliser array_reduce

$x_arr = array(
    array('id' => 30, 'count' => 3), 
    array('id' => 45, 'count' => 7), 
); 

$y_arr = array_reduce($x_arr, function ($result, $item) { 
    $result[$item['id']] = array('count' => $item['count']); 
    return $result; 
}, array()); 

print_r($y_arr); 

Il vous donnera le résultat souhaité:

Array 
(
    [30] => Array 
    (
     [count] => 3 
    ) 

    [45] => Array 
    (
     [count] => 7 
    ) 
) 
5

Vous pouvez le faire en une ligne avec array_column:

$array = array_column($array, null, 'id'); 

La seule différence entre votre sortie désirée est que cela contiendra toujours la clé id dans le second niveau du tableau, comme ceci:

[ 
    30 => ['id' => 30, 'count' => 3], 
    45 => ['id' => 45, 'count' => 7], 
] 

mais cela ne devrait pas causer de problèmes. Si vous avez besoin de l'enlever, vous pouvez le faire avec quelque chose comme:

$array = array_map(function ($e) { 
    unset($e['id']); 
    return $e; 
}, $array); 

Cette approche est probablement mieux si vos lignes pourraient avoir beaucoup plus de clés à eux dans l'avenir, à savoir qu'il est plus rapide à la liste les touches suppriment plutôt que celles à conserver. Si non, et vous n'aurez qu'un compte, alors pour être honnête votre exemple original est probablement le meilleur que vous obtiendrez.

+0

À mon avis, c'est bien, je ne vois pas pourquoi le second tableau de couches est nécessaire. Qu'est-ce qui ne va pas avec '[30] =>" 3 "'? – Andreas

+0

Mais je dois me débarrasser de la clé 'id'. C'est la capture. – cleverketchup

+1

@cleverketchup Voir mes modifications – iainn