2010-08-04 5 views
-1

Je me demandais si cet extrait de code est considéré comme légal:écraser boucle php en le bouclant, puis casser?

$arr = array(123,456,789,123,456,789); 
foreach($arr as $a) { 
    $arr = $a; 
    break; 
} 
//prints 123 
echo $arr; 

Il exécute, mais sont-il des pièges que je devrais savoir utiliser cette méthode?


Mise à jour: Voici le problème réel
Vous avez un tableau comme suit de la requête de base de données ( select * from table where code = $code)

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [code] => 1234567 
      [member_id] => 7 
     ) 

    [1] => Array 
     (
      [id] => 5 
      [code] => 1234567 
      [member_id] => 
     ) 

    [2] => Array 
     (
      [id] => 67 
      [code] => 1234567 
      [member_id] => 43 
     ) 

) 

tout ce que vous aimez est de trouver la première (le cas échéant) la ligne qui a un member_id vide (cela signifie que le code n'a pas été revendiqué).

Alors, comment allez-vous faire cela? Selon Felix Kling, en utilisant la variable pour contenir le tableau de codes et en l'écrasant avec la ligne que vous voulez n'est pas la meilleure solution, alors que proposez-vous.

En outre, crédit de bonus: Combien de codes différents à 7 chiffres pouvez-vous générer en utilisant 32 caractères (caractères dupliqués autorisés)?

est-il 32^32 * 7 ou ((((((32^32)^32)^32)^32)^32)^32)^32)?

+0

Ah oui mon erreur, Ce fut une mauvaise copie coller par exemple, je remplacé la boucle – Hailwood

+0

Je recommande de ne pas utiliser la boucle foreach, car elle est beaucoup plus lente que la boucle normale. Source: http://www.phpbench.com/ – Alexander

+0

Pourquoi voulez-vous le faire en PHP plutôt que dans la requête elle-même? – ryeguy

Répondre

2

Comme d'autres l'ont expliqué, il n'y a aucune raison de réutiliser la variable. Y a-t-il une raison à cela? Pourquoi ne pas en créer un nouveau?

$resultId = 0; 

foreach ($result as $row) { 
    if ($row["member_id"] == "") { 
     $resultId = $row["id"]; 
     break; 
    } 
} 

Mais voici la grande question - pourquoi ne faites-vous pas cela en SQL? Vous créez déjà une requête SQL. Quel est le problème avec select * from table where code = $code and member_id = null? Btw, pour répondre à votre autre question: Nombre de permutations à sept caractères, chacune avec 32 possibilités différentes = 32^7.

+0

Parce que, s'il n'y a pas de codes gratuits, je dois faire d'autres vérifications pour voir si la personne qui réclame le code l'a déjà revendiquée (à des fins d'édition de détails). – Hailwood

0

Cela peut fonctionner, mais il est définitivement mauvais style de codage et rend votre code plus difficile à comprendre. Parce que si vous utilisez des noms variables plus significatifs, il ne fait pas plus de sens:

$scores = array(123,456,789,123,456,789); 
foreach($scores as $score) { 
    $scores = $score; 
    break; 
} 
//prints 123 
echo $scores; 

Dans ce cas, $scores suggère de tenir quelque chose comme une liste, pas un seul élément (ou imaginez que vous utilisez $score_list ... encore pire). Et il ne va pas améliorer si vous commencez à donner vos noms de variables qui correspondent à différents types de valeurs;)


Rappelez-vous: Tout ce qui est possible doit être fait. Je voudrais absolument éviter cela.

+0

@Hailwood: Cela ne change rien. C'est une mauvaise pratique. Si vous réutilisez la variable, cela rend votre code plus difficile à comprendre et plus difficile à maintenir à long terme. Le fait est que le code est beaucoup plus souvent lu que écrit. Créer un code * lisible *. Performancewise, avoir une variable supplémentaire ne fait aucune différence. –

1

Ainsi,

en utilisant cette méthode fonctionne très bien aussi longtemps que vous utilisez uniquement une copie du tableau.

Si vous deviez passer dans le tableau par référence foreach($code_info as &$code) alors vous recevrez un Invalid argument supplied for foreach() d'erreur.

0
$empty_number=-1; 
foreach($arr as $a=>$b) 
{ 
    if($b['member_id']!='') 
    { 
    $empty_number=$a; 
    break; 
    } 
} 

L'indice pour le nombre vide est stocké dans la variable $ empty_number de .. s'il n'y a pas de ligne avec une balise member_id vide, la valeur de empty_number de $ est -1.

EDIT:

Pour votre question bonus, le maximum serait 32^7 = 34 359 738 368