8721 sujets

Développement web côté serveur, CMS

Bonjour,

Je souhaite afficher dans ma page web les resultats d'une recherche via un formulaire.
Le resultat est un tableau a afficher et quand j utilise var_dump ou print_r, il s affiche "array(" avant les informations a afficher.
Comment creer ma propre fonction avec boucle ?
Modérateur
En vous basant sur un truc du genre peut-être

function echoArray(&$array, $output = '') {
  $output = $output . '<ul>';
  if     (empty($array))     { return $output . '</ul>';                        }
  elseif (!is_array($array)) { return '<li>' . $array . '</li></ul>'; }
  foreach ($array as $k => $v) {
    if (is_array($v)) {
      $output .= '<li>' . $k;
      return echoArray($v, $output) . '</li>';
    }
    $output .= '<li>' . $k . ' &rarr; ' . $v . '</li>';
  }
  $output .= '</ul>';
  return $output;
}

Bien sûr ça mériterait d'être peaufiné mais dans le principe c'est exactement cela, soit une fonction récursive.
Modifié par Greg_Lumiere (26 Feb 2020 - 10:21)
Jai essayé ca mais rien ne s affiche desole

function echoArray($results, $output = '') {
$output = $output . '<ul>';
if (empty($results)) { return $output . '</ul>'; }
elseif (!is_array($results)) { return '<li>' . $array . '</li></ul>'; }
foreach ($array as $k => $v) {
if (is_array($v)) {
$output .= '<li>' . $k;
return echoArray($v, $output) . '</li>';
}
$output .= '<li>' . $k . ' $array ' . $v . '</li>';
}
$output .= '</ul>';
return $output;
}
Modérateur
Une petite coquille s'était glissée dans le code précédent, cette fonction est plus aboutie

function echoArray(&$array, $output = '') {
  $output = $output . '<ul>';
  if     (empty($array))     { return; }
  elseif (!is_array($array)) { $output .= '<li>' . $array . '</li>'; }
  else {
    foreach ($array as $k => $v) {
      if (!is_array($v)) {
        $output .= '<li>' . $k . ' &rarr; ' . $v . '</li>';
      } else {
        $output .= '<li>' . $k;
        $output .= echoArray($v, $output) . '</li>';
      }
    }
  }
  $output .= '</ul>';
  return $output;
}

echo echoArray($mon_tableau_a_formater);

Modifié par Greg_Lumiere (26 Feb 2020 - 10:59)
Meilleure solution
Cest niquel !
Jai ajouté de la mise en forme cest propre au niveau de l affichage
JE remarque que je ne peux pas appliquer la fonction <pre>

Il reste deux problemes :

- Quand il y a qu un tableau ca va mais si il y en a plusieurs il met un tableau en tete puis tous les tableaux a suivre. Je souhaite ne pas afficher le tableau en tete
- Je souhaiterais ajouter des séparateurs entre les resultats par contre mais en vain.
Modérateur
à la ligne
$output .= echoArray($v, $output) . '</li>';
il vaut mieux la transformer telle que
$output .= echoArray($v) . '</li>';


Je n'ai pas bien compris ce que vous cherchiez à faire...
ah oui cétait ca effectivement... Jai bien mes resultats qui s affichent sans en tete.
Maintenant je voudrais séparerles infos par une virgule et un espace.

Voici ce qu il m affiche:
Nom ? MARTINPrenom ? Jerome

Je souhaite ajouter un ", "

et apres cest bon pour moi encore merci
Modérateur
fanch2506 a écrit :
ah oui cétait ca effectivement... Jai bien mes resultats qui s affichent sans en tete.
Maintenant je voudrais séparerles infos par une virgule et un espace.

Voici ce qu il m affiche:
Nom ? MARTINPrenom ? Jerome

Je souhaite ajouter un ", "

et apres cest bon pour moi encore merci

Là ça peut s'avérer plus complexe qu'il ne semble au premier abord. En effet, il faut prendre en considération qu'on ne veut pas de virgule si l'élément est seul (1 seule ligne de donnée dans le tableau) et pour le dernier élément de la série.

Pourriez-vous partager l'avancée de vos travaux ?
D'autre part, votre tableau de donnée est-il possiblement un tableau multi-dimensionnel ou pas ?
Salut Greg et Fanch,

a priori tu gères déjà correctement le cas où l'élément est seul.
Et pour le cas où c'est un tableau (dans ton 2e else), pour ne pas trop se prendre la tete, tu dois pouvoir faire simplement un pop de la dernière valeur et la stocker, traiter tout le tableau normalement en mettant des virgules à la fin, puis traiter la dernier valeur du tableau qui n'aura pas de virgule Smiley smile

Bon courage
Bon. Finalement en passant a la ligne apres chaque information issue du tableau, on obtient un rendu interessant visuellement. Ce que je ne comprend pas cest la mise en forme est comme avec la fonction pre mais sans l utiliser... Cest bizarre !
j ai ajouté du list-style none dans le CSS et cest parfait

JE redonne la sequence donnée par Greg et amelioree pour mon cas précis :

function echoArray(&$array, $output = '') {
$output = $output . '<ul>';
if (empty($array)) { return; }
elseif (!is_array($array)) { $output .= '<li>' . $array . '</li>'; }
else {
foreach ($array as $k => $v) {
if (!is_array($v)) {
$output .= '<li>' . $k . ' &rarr; ' . $v . '</li>';
} else {

$output .= echoArray($v) . '</li><Br></Br>';
}
}
}
$output .= '</ul>';
return $output;
}
echo '<h2>';
echo echoArray($results);
echo '</h2>';
}

Par contre j ai deja des <li> dans la page ou je veux integrer le code...
Jai essaye de les supprimer mais du coup ca bloque sur les points
Modérateur
@Mathieuu : Salut, j'adore l'idée du array_pop, je n'y avais jamais pensé. J'ai pris l'habitude de passer par du comptage d'éléments.

@Fanch : Je ne suis peut-être pas encore bien réveillé mais... je ne comprends rien à votre histoire de liste Smiley rolleyes
J'étais partis sur une liste instinctivement. En fait je n'avais vu qu'après coup que vous souhaitiez un tableau mais l'adaptation n'est pas bien compliquée. Le choix des balises à utiliser va essentiellement dépendre du résultat espérer en front. La liste ça se travaille bien mais on peut tout aussi bien imaginer un tableau, des paragraphes ou toute autre chose.

Dans le code précédemment publié, j'y vois ceci:
<br></br>
2 remarques à ce propos :
- <br> est une balise auto-clavée donc inutile de l'ouvrir pour la fermer ensuite (là en fait vous ajoutez 2 sauts de lignes) ; la forme <br> est valide en html5 alors qu'on préfèrera </br> en xHtml si je ne m'abuse.
- il est invalide de rajouter ces balises dans une liste. Si vous nécessitez des espacements et/ou émargements, passez par une personnalisation en Css (astuce: ajoutez des classes côtés php pour les cibler ensuite en Css).

C'est tout...pour le moment
nope, </Br> n'existe pas et il n'y a pas lieu de mettre des br autrement que pour faire des sauts de lignes Smiley cligne
Je reviens sur le sujet car je bloque sur un probleme.
Le resultat obtenu est bien sous forme d une liste de lignes cest parfait mais je souhaterais ajouter un numero de ligne en tete . Jai essayé list-style-type: decimal mais cela ne fonctionne pas. Pourquoi ?
Je rappelle le code concerné :

function echoArray(&$array, $output = '') {
$output .= '<ul>';
if (empty($array)) { return; }
elseif (!is_array($array)) { $output .= '<li>' . $array . '</li>'; }
else {
foreach ($array as $k => $v) {
if (!is_array($v)) {


$output .= '<li>' . ' ' . $v . ' /</li>';

} else {

$output .= '<li>' . echoArray($v) . '</li><Br>';

}
}
}
$output .= '</ul>';
return $output;
}
echo '<h3>';
echo echoArray($results);
echo '</h3>';
}