web-dev-qa-db-fra.com

PHP foreach qui ne retourne que des clés

Question théorique qui n'a peut-être aucun sens, mais peut-être y at-il une réponse intelligente.

Je veux parcourir le tableau et obtenir ses clés et quelque chose avec eux. Un exemple rapide de ce que je fais:

foreach($array as $key => $value) {
    $other_array[$key] = 'something';
}

Maintenant, PHP Mess Detector crie que $value est inutilisé dans cette étendue. Par conséquent, je pensais que ce n’était peut-être pas la meilleure façon d’accéder à keys de mon array

Avez-vous une idée de la façon de le faire sans supprimer inutilement values de ma array? Cela a-t-il un impact significatif sur les performances ... ou peut-être suis-je simplement paranoïaque et devrais-je continuer sans perdre de temps à quiconque avec des questions stupides :).

26
RandomWhiteTrash

Tu pourrais faire quelque chose comme ça

foreach(array_keys($array) as $key) {
 // do your stuff
}

Cela ferait le foreach itérer sur un tableau composé des clés de votre tableau au lieu du tableau réel. Notez que ce n'est probablement pas mieux du point de vue des performances.

51
inquam

Ignorez simplement ce message.

Dans PHP, la façon dont vous avez utilisé foreach est la plus rapide. Il est vrai que vous devriez éviter les variables inutilisées, mais dans ce cas, vous ne pouvez pas l'éviter sans perdre de la performance.

Par exemple. foreach(array_keys($arr) as $key) est environ 50% à 60% plus lent
que foreach($arr as $key => $notUsed).

Ce numéro de phpmd est déjà rapporté ici et il existe également une demande de tirage ici .

Jusqu'à ce que phpmd soit mis à jour, vous pouvez aussi utiliser ce petit bidouillage

Dans le fichier /src/main/php/PHPMD/Rule/UnusedLocalVariable.php dans la méthode collectVariables(..) (ligne 123 dans mon cas), remplacez

if ($this->isLocal($variable))

par

if ($this->isLocal($variable) && !($this->isChildOf($variable, 'ForeachStatement') && $variable->getName() === '$notUsed'))

Cela empêchera phpmd de signaler $notUsedn'importe où à l'intérieur d'une boucle foreach.

UPDATE: La recommandation ci-dessus suppose que PHP 5.6 (la version pertinente au moment de la rédaction de cette réponse). Mais le temps a passé et maintenant, en utilisant PHP 7.2, il semble que ce soit l'inverse. Comme toujours, cela dépend du cas d'utilisation exact, mais pour les tableaux associatifs de moins de 100 000 clés, il est plus rapide de stocker array_keys($arr) dans une variable et de l'utiliser dans une boucle foreach.

8
AbcAeffchen

Oui, il existe un moyen plus rapide de faire cela: http://php.net/manual/en/function.array-keys.php

5
LeJared

C'est valide PHP code, ne corrigez pas le code, mais corrigez PHP MD. Il y a une configuration dans PHP MD 2.2 Et a besoin de cette règle:

<properties>
    <property
        name="allow-unused-foreach-variables"
        description="Allow unused variables in foreach language constructs."
        value="false" />
</properties>
1
botris

Si vous voulez définir toutes les clés à une certaine valeur, vous pouvez simplement le faire de cette façon:

$array = array(
        'foo'=> 'oldval1',
        'bar'=> 'oldval2',
        'baz'=> 'oldval3'
);

$other_array = array_fill_keys(array_keys($array), 'something');
print_r($other_array);

Cela produira:

Array
(
    [foo] => something
    [bar] => something
    [baz] => something
)
1
core1024

boucle pour éviter une foreach dans un moment.

$a = ['1','A','B','12','ui'];

 while(true) { sleep(1);
    $b = next($a) ? current($a): reset($a);
    echo key($a) , ':' , $b , PHP_EOL;
 }
0
Darksynx