web-dev-qa-db-fra.com

php foreach avec tableau multidimensionnel

Je développe une application php qui utilise une classe de base de données pour interroger mySQL.

la classe est ici: http://net.tutsplus.com/tutorials/php/real-world-oop-with-php-and-mysql/

J'ai fait quelques ajustements sur la classe pour répondre à mes besoins, mais il y a un problème (peut-être un stupide)

Quand select () est utilisé, il retourne un tableau multidimensionnel comme celui d’une table à 3 colonnes (id, prénom, nom de famille):

 Array 
 (
 [0] => Array 
 (
 [Id] => 1 
 [Prénom] => Prénom un 
 [Nom] => Nom un 
) 

 [1] => Tableau 
 (
 [Id] => 2 
 [Prénom] => Prénom deux 
 [Nom] => Nom deux
) 

 [2] => Array 
 (
 [Id] => 3 
 [Prénom] => Prénoms trois 
 [Nom] => Nom trois 
) 
) 

Maintenant, je veux que ce tableau soit utilisé comme résultat mysql (mysql_fetch_assoc).

Je sais que cela peut être utilisé avec foreach () mais c'est avec des tableaux simples. donc je pense que je dois redéclarer un nouveau foreach () avec chaque foreach (), mais je pense que cela pourrait ralentir ou causer une charge de serveur plus importante.

Alors, comment appliquer la méthode la plus simple pour foreach () avec ce tableau multidimensionnel?

Merci

47
medk

Vous pouvez utiliser foreach ici très bien.

foreach ($rows as $row) {
    echo $row['id'];
    echo $row['firstname'];
    echo $row['lastname'];
}

Je pense que vous avez l'habitude d'accéder aux données avec des indicateurs numériques (tels que $row[0]), mais ce n'est pas nécessaire. Nous pouvons utiliser tableaux associatifs pour obtenir les données que nous recherchons.

104
Brad

Vous pouvez utiliser array_walk_recursive:

array_walk_recursive($array, function ($item, $key) {
    echo "$key holds $item\n";
});
13
Karolis

Cela aurait été un commentaire selon la réponse de Brad, mais ma réputation n'est pas assez bonne.

Récemment, j’ai trouvé que j’avais également besoin de la clé du tableau multidimensionnel, c’est-à-dire qu’il ne s’agissait pas uniquement d’un index du tableau, dans la boucle foreach.

Pour ce faire, vous pouvez utiliser quelque chose de très similaire à la réponse acceptée, mais diviser la clé et la valeur comme suit:

foreach ($mda as $mdaKey => $mdaData) {
    echo $mdaKey . ": " . $mdaData["value"];
}

J'espère que ça aide quelqu'un.

4
arvy3

Holla/Bonjour , .__ Je l'ai! Vous pouvez facilement obtenir le nom du fichier, le nom du fichier tmp, la taille du fichier, etc.

for ($i = 0 ; $i < count($files['name']); $i++) {
    echo $files['name'][$i].'<br/>';
}

Il est testé sur mon PC.

3
Asraful Haque

Exemple avec mysql_fetch_assoc():

while ($row = mysql_fetch_assoc($result))
{
    /* ... your stuff ...*/
}

Dans votre cas avec foreach, avec le tableau $result que vous obtenez de select():

foreach ($result as $row)
{
    /* ... your stuff ...*/
}

C'est un peu la même chose, avec une itération appropriée.

2
aorcsik

Obtenir des détails de chaque valeur dans un tableau multidimensionnel est assez simple une fois que vous avez votre tableau en place. Voici donc le tableau:

$example_array = array(
array('1','John','Smith'),
array('2','Dave','Jones'),
array('3','Bob','Williams')
);

Ensuite, utilisez une boucle foreach et faites passer le tableau de la manière suivante:

foreach ($example_array as $value) {
echo $value[0]; //this will echo 1 on first cycle, 2 on second etc....
echo $value[1]; //this will echo John on first cycle, Dave on second etc....
echo $value[2]; //this will echo Smith on first cycle, Jones on second etc....
}

Vous pouvez faire écho à ce que vous voulez autour de vous, pour résonner dans une table:

echo "<table>"
    foreach ($example_array as $value) {
    echo "<tr><td>" . $value[0] . "</td>";
    echo "<td>" . $value[1] . "</td>";
    echo "<td>" . $value[2] . "</td></tr>";
    }
echo "</table>";

Devrait vous donner un tableau comme celui-ci:

|1|John|Smith   |
|2|Dave|Jones   |
|3|Bob |Williams|
2
Rmj86

Avec des tableaux en php, la boucle foreach est toujours une jolie solution.
Dans ce cas, cela pourrait être par exemple:

foreach($my_array as $number => $number_array)
    {
    foreach($number_array as $data = > $user_data)
        {
            print "Array number: $number, contains $data with $user_data.  <br>";
        }
    }
2
nao_de_naoned

Dans l'idéal, un tableau multidimensionnel est généralement un tableau de tableaux. J'ai donc décidé de déclarer un tableau vide, puis de créer des paires clé/valeur à partir du résultat de la base de données dans un tableau séparé. vous pouvez renvoyer la matrice externe s'il s'agit d'un appel de fonction séparé. J'espère que cela pourra aider

$response = array();    
foreach ($res as $result) {
        $elements = array("firstname" => $result[0], "subject_name" => $result[1]);
        array_Push($response, $elements);
    }
1
Poly

Je sais que c'est une réponse assez ancienne. Voici une solution plus rapide sans utiliser foreach

Utilisez array_column

print_r(array_column($array, 'firstname')); #returns the value associated with that key 'firstname'

Aussi, vous pouvez vérifier avant d'exécuter l'opération ci-dessus

if(array_key_exists('firstname', $array)){
   print_r(array_column($array, 'firstname'));
}
1
Akintunde-Rotimi

Par exemple, si vous avez besoin de manipuler des chaînes de caractères sur des éléments de tableau, utiliser la fonction de rappel array_walk_recursive (ou même array_walk ) fonctionne bien. Les deux sont utiles lors de l'écriture dynamique d'instructions SQL.

Dans cet usage, j'ai ce tableau avec chaque élément nécessitant une virgule et une nouvelle ligne.

$some_array = [];

données dans $ some_array
0: "Une chaîne dans un tableau"
1: "Une autre chaîne dans un tableau" 

Per php.net

Si callback doit travailler avec les valeurs réelles du tableau, spécifiez le premier paramètre de rappel comme référence. Ensuite, tout les modifications apportées à ces éléments seront effectuées dans le tableau d'origine lui-même.

array_walk_recursive($some_array, function (&$value, $key) {
    $value .= ",\n";
});

Résultat:
"Une chaîne dans un tableau,\n"
"Une autre chaîne dans un tableau,\n" 

Voici le même concept utilisant array_walk pour ajouter le nom de la table de la base de données au champ.

$fields = [];

données dans les champs $:
0: "Prénom"
1: "Nom" 

$tbl = "Employees"

array_walk($fields, 'prefixOnArray', $tbl.".");

function prefixOnArray(&$value, $key, $prefix) { 
    $value = $prefix.$value; 
}

Résultat:
"Employees.FirstName"
"Employees.LastName" 


Je serais curieux de savoir si la performance est en cause, mais pour un tableau avec une poignée d'éléments, à mon humble avis, cela ne vaut guère la peine d'être envisagé.

0
Greg Bologna

Une forfor normale ne donnerait-elle pas fondamentalement le même résultat qu'un mysql_fetch_assoc dans votre cas?

en utilisant foreach sur ce tableau, vous obtiendrez un tableau contenant ces trois clés: 'id', 'prénom' et 'nom de famille'.

Cela devrait être identique à ce que mysql_fetch_assoc donnerait (en boucle) pour chaque ligne.

0
Yhn
foreach ($parsed as $key=> $poke)
{
    $insert = mysql_query("insert into soal 
                          (pertanyaan, a, b, c, d, e, jawaban)
                          values
                          ('$poke[question]',
                          '$poke[options][A]',
                          '$poke[options][B]',
                          '$poke[options][C]',
                          '$poke[options][D]',
                          '$poke[options][E]',
                          '$poke[answer]')");
}
0
endip