Page 1 sur 2

utilisation de "function"

Posté : 22 sept. 2010, 02:50
par Gakman
Salut à tous !

Alors voilà ma "fonction" :
(j'ai un array ordonné "$liste" déterminée avant)
                $titre = 'vacances';
                    echo '<h1>'.ucfirst($titre).' :</h1><ul>';
                    $cle = substr($titre,0,1);
                    for($i=0;$i<sizeof($liste);$i++){
                        if ((($liste[$i]{12} == '+') && ($liste[$i]{11} == $cle)) || (($liste[$i]{6} == '+') && ($liste[$i]{5} == $cle)) || (($liste[$i]{1} == '+') && ($liste[$i]{0} == $cle))) {
                            list($f,$f_court)=explode('|',$liste[$i]);
                            $f_long = str_replace('+','---',$f);
                            if ($f{12} == '+') {echo '<li><a href="dossiers.php?dossier='.$f_long.'">'.$f_court.' &nbsp; ('.substr($f_long,8,2).'/'.substr($f_long,5,2).'/'.substr($f_long,0,4).')</a></li>';}
                            elseif ($f{6} == '+') {echo '<li><a href="dossiers.php?dossier='.$f_long.'">'.$f_court.' &nbsp; ('.substr($f_long,0,4).')</a></li>';}
                            else {echo '<li><a href="dossiers.php?dossier='.$f_long.'">'.$f_court.'</a></li>';}
                        }
                    }
                    echo '</ul><br /><br />';
Comme ça ça marche parfaitement (j'obtiens ma liste).

Mais si je fais :
function listage($titre) {pareil sans le $titre='vacances';}
listage ('vacances');
alors j'ai juste le texte entre les <h1> qui apparait et aucune liste. Si je regarde le code source je vois juste :
<h1>Vacances :</h1><ul></ul><br /><br />
J'ai même essayé de faire
function listage () {pareil qu au début}
listage();
et même résultat que juste avant.

Alors quel est mon soucis ?
Ma boucle For ne passe pas dans une fonction ?
Merci de votre aide, je sèche, là.

Re: utilisation de "function"

Posté : 22 sept. 2010, 02:56
par stealth35
hello,
je pour voir mieux, met en entier ta fonction ($liste ca sort d'ou ?)
indente ton code et met les balise [ php][/php]

et a quoi sert ta fonction ?

Re: utilisation de "function"

Posté : 23 sept. 2010, 01:22
par Gakman
Si tu veux le code en entier :
<?php

                $rep = 'heberg/';
                $dir = opendir($rep);
                $liste = array();
                $origine = array('__-', '__e', '_-e', '__c', '_');
                $remplace   = array('--- ', '&eacute;', '&egrave;', '&ccedil;', ' ');

                while ($f = readdir($dir)) {
                    if(is_dir($rep.$f)) {
                        if(($f != '.') && ($f != '..') && (substr($f,-3) != '_tn')) {
                            if (($f{12} == '+') || ($f{6} == '+') || ($f{1} == '+')) {$f_court = str_replace('--- ','\'',ucwords(str_replace($origine,$remplace,substr(strrchr($f,'+'),1))));}
                            else $f_court=str_replace('_',' ',$f);
                            array_push($liste,$f.'|'.$f_court);
                        }
                    }
                }
                closedir($dir);

                usort($liste,'strcasecmp');

// 1e occurrence de ma fonction : 

                $titre = 'vacances';
                    echo '<h1>'.ucfirst($titre).' :</h1><ul>';
                    $cle = substr($titre,0,1);
                    for($i=0;$i<sizeof($liste);$i++){
                        if ((($liste[$i]{12} == '+') && ($liste[$i]{11} == $cle)) || (($liste[$i]{6} == '+') && ($liste[$i]{5} == $cle)) || (($liste[$i]{1} == '+') && ($liste[$i]{0} == $cle))) {
                            list($f,$f_court)=explode('|',$liste[$i]);
                            $f_long = str_replace('+','---',$f);
                            if ($f{12} == '+') {echo '<li><a href="dossiers.php?dossier='.$f_long.'">'.$f_court.' &nbsp; ('.substr($f_long,8,2).'/'.substr($f_long,5,2).'/'.substr($f_long,0,4).')</a></li>';}
                            elseif ($f{6} == '+') {echo '<li><a href="dossiers.php?dossier='.$f_long.'">'.$f_court.' &nbsp; ('.substr($f_long,0,4).')</a></li>';}
                            else {echo '<li><a href="dossiers.php?dossier='.$f_long.'">'.$f_court.'</a></li>';}
                        }
                    }
                    echo '</ul><br /><br />';

// 2e occurrence de ma fonction : 

                $titre = 'famille';
                    echo '<h1>'.ucfirst($titre).' :</h1><ul>';
                    $cle = substr($titre,0,1);
                    for($i=0;$i<sizeof($liste);$i++){
                        if ((($liste[$i]{12} == '+') && ($liste[$i]{11} == $cle)) || (($liste[$i]{6} == '+') && ($liste[$i]{5} == $cle)) || (($liste[$i]{1} == '+') && ($liste[$i]{0} == $cle))) {
                            list($f,$f_court)=explode('|',$liste[$i]);
                            $f_long = str_replace('+','---',$f);
                            if ($f{12} == '+') {echo '<li><a href="dossiers.php?dossier='.$f_long.'">'.$f_court.' &nbsp; ('.substr($f_long,8,2).'/'.substr($f_long,5,2).'/'.substr($f_long,0,4).')</a></li>';}
                            elseif ($f{6} == '+') {echo '<li><a href="dossiers.php?dossier='.$f_long.'">'.$f_court.' &nbsp; ('.substr($f_long,0,4).')</a></li>';}
                            else {echo '<li><a href="dossiers.php?dossier='.$f_long.'">'.$f_court.'</a></li>';}
                        }
                    }
                    echo '</ul><br /><br />';

// comment placer le tout dans une fonction et l'appeler 2 fois au lieu de ces 2 paragraphes identiques ?

                echo '<h1>.</h1><ul>';
                for($i=0;$i<sizeof($liste);$i++){
                    if (($liste[$i]{12} != '+') && ($liste[$i]{6} != '+') && ($liste[$i]{1} != '+')) {
                        list($f,$f_court)=explode('|',$liste[$i]);
                        echo '<li><a href="dossiers.php?dossier='.$f.'">'.$f_court.'</a></li>';
                    }
                }
                echo '</ul><br /><br />';

?>
Voilà l'essentiel de la page, c'est-à-dire tout sauf la présentation (HTML-CSS). Comme je le disais $liste est un array créé avant. Cette partie n'est pas importante, le résultat est que j'ai juste un array $liste('','','',...).
Donc simplement le script crée une liste à partir des dossiers présents pour faire un site de photos et vidéos personnelles (pour la famille).

Pour l'indentation je suis désolé, elle est faite correctement dans mon fichier mais lorsque je poste le code ici le site la retranscrit très mal, à cause de ma lignes longues qui sont ici retournées à la ligne.

Vous voyez que j'utilise exactement 2 fois les même lignes en assignant juste une fois $titre = 'vacances'; et l'autre $titre = 'famille';. A terme il devrait y avoir d'autres catégories donc se serait nettement plus élégant de passer par une fonction.
Mais comme je l'expliquais je en vois pas mon erreur : là ça marche parfaitement, mais je crée la "function listage($titre) {CODE}" et que je l'appelle par listage('vacances'); et listage('famille');, j'obtiens les titres mais pas les listes des dossiers. Le code source retourné par le serveur est par exemple :
<h1>Vacances :</h1><ul></ul><br /><br />
Le soucis n'est pas le code lui-même. Il peut je n'en doute pas être amélioré mais dans l'état il marche ! Mon problème est le passage en forme de fonction pour ne pas le recopier à chaque catégorie, qui lui me pose problème.

Re: utilisation de "function"

Posté : 23 sept. 2010, 01:28
par stealth35
pour l'indentation c'est parce que il faut utiliser bouton php et pas le bouton code

j'ai l'impression que y'a beaucoup de blabla, ta un exemple de rendu final ?

Re: utilisation de "function"

Posté : 23 sept. 2010, 01:34
par Gakman
Oui j'ai corrigé pour PHP, j'ai vu :roll:.

Un exemple sans "blabla"... J'essaye !

Structure du serveur :
serveur (contient le fichier du scipt)
-dossier heberg/
-- dossiers de photos (avec un nom particulier : "date-catégorie+lieu")
-- ...

Effet du script :
titre catégorie 1
_ liste lieu (date) triée par date
_ ...
catégorie 2
_ ...

Re: utilisation de "function"

Posté : 23 sept. 2010, 01:36
par stealth35
le "blabla" c'etait pour le code (beaucoup le ligne pour peu) pas pour ton message :wink:

EDIT : t'as quelle version de php ?

Re: utilisation de "function"

Posté : 23 sept. 2010, 01:47
par Gakman
Voilà le code avec l'utilisation de function qui ne fonctionne pas.
<?php
                $rep = 'heberg/';
                $dir = opendir($rep);
                $liste = array();
                $origine = array('__-', '__e', '_-e', '__c', '_');
                $remplace   = array('--- ', '&eacute;', '&egrave;', '&ccedil;', ' ');

                while ($f = readdir($dir)) {
                    if(is_dir($rep.$f)) {
                        if(($f != '.') && ($f != '..') && (substr($f,-3) != '_tn')) {
                            if (($f{12} == '+') || ($f{6} == '+') || ($f{1} == '+')) {$f_court = str_replace('--- ','\'',ucwords(str_replace($origine,$remplace,substr(strrchr($f,'+'),1))));}
// dans l'ordre (droite à gauche) : garder que à partir du +, commencer au 2e carcatère, remplacer selon les 2 array, mettre des majusclues, remplacer l'apostrophe (hors des arrays pour mettre majuscule après)
                            else $f_court=str_replace('_',' ',$f);
                            array_push($liste,$f.'|'.$f_court);
// ICI : inverser f et f_court pour passer d'un classement par la date à un classement par le nom de lieu du titre du dossier
                        }
                    }
                }
                closedir($dir);

                usort($liste,'strcasecmp');

                function listage($titre) {
                    echo '<h1>'.ucfirst($titre).' :</h1><ul>';
                    $cle = substr($titre,0,1);
                    for($i=0;$i<sizeof($liste);$i++){
                        if ((($liste[$i]{12} == '+') && ($liste[$i]{11} == $cle)) || (($liste[$i]{6} == '+') && ($liste[$i]{5} == $cle)) || (($liste[$i]{1} == '+') && ($liste[$i]{0} == $cle))) {
                            list($f,$f_court)=explode('|',$liste[$i]);
                            $f_long = str_replace('+','---',$f);
                            if ($f{12} == '+') {echo '<li><a href="dossiers.php?dossier='.$f_long.'">'.$f_court.' &nbsp; ('.substr($f_long,8,2).'/'.substr($f_long,5,2).'/'.substr($f_long,0,4).')</a></li>';}
                            elseif ($f{6} == '+') {echo '<li><a href="dossiers.php?dossier='.$f_long.'">'.$f_court.' &nbsp; ('.substr($f_long,0,4).')</a></li>';}
                            else {echo '<li><a href="dossiers.php?dossier='.$f_long.'">'.$f_court.'</a></li>';}
                        }
                    }
                    echo '</ul><br /><br />';
                }

                listage('vacances');

                listage('famille');

                echo '<h1>.</h1><ul>';
                for($i=0;$i<sizeof($liste);$i++){
                    if (($liste[$i]{12} != '+') && ($liste[$i]{6} != '+') && ($liste[$i]{1} != '+')) {
                        list($f,$f_court)=explode('|',$liste[$i]);
                        echo '<li><a href="dossiers.php?dossier='.$f.'">'.$f_court.'</a></li>';
                    }
                }
                echo '</ul><br /><br />';

?>
Pour PHP la page est chez Free. Une demande (phpversion) me répond 4.4.3-dev.

Pour la qualité du code... Je me doute :roll: ! En fait j'essaye de faire des choses simples et je les complexifie au fur et à mesure, et comme je ne connais pas énormément de commandes PHP je fais avec ce que j'ai, et voilà le résultat !

Re: utilisation de "function"

Posté : 23 sept. 2010, 01:56
par stealth35
deja passe a php 5
il suffis de créer un fichier nommer .htaccess et de meme juste : php 1 dedans, et le ficheir tu le met a la racine de ton site

Re: utilisation de "function"

Posté : 23 sept. 2010, 02:00
par Gakman
C'est fait !
Maintenant je suis en 5.1.3RC4-dev mais aucun changement.

Re: utilisation de "function"

Posté : 23 sept. 2010, 02:02
par stealth35
C'est fait !
Maintenant je suis en 5.1.3RC4-dev mais aucun changement.
ca arrive :wink:

Re: utilisation de "function"

Posté : 23 sept. 2010, 02:07
par Gakman
OK merci ! Je guète le bon résultat alors :).

Re: utilisation de "function"

Posté : 23 sept. 2010, 02:10
par stealth35
OK merci ! Je guète le bon résultat alors :).
si les informations que t'as donnée sont correct (surtout pour le nom du fichier) ca devrais donnée ca
error_reporting(-1);
$dir = new DirectoryIterator('heberg'); 

foreach($dir as $filename => $file)
{
    preg_match('/^(?P<date>[^-]+)-(?P<category>[^+]+)\+(?P<lieu>.+)$/u', $filename, $matches);
    $temp[$matches['category']][$matches['lieu']][$matches['date']] = $file;
    
    ksort($temp);
    ksort($temp[$matches['category']]);
    ksort($temp[$matches['category']][$matches['lieu']]);        
}

$arr = new RecursiveArrayIterator($temp);
$rec = new RecursiveIteratorIterator($arr, RecursiveIteratorIterator::SELF_FIRST);

foreach($rec as $key => $value)
{
    switch($rec->getDepth())
    {
        case 0:
            echo '<h1>' . $key . '<h1>';
            break;
        case 1:
            echo '<h2>' . $key . '<h2>';
            break;
        case 2:
            echo '<h3>' . $value . '<h3>';
            break;
        default:
            break;
    }
}
mais ca marche jamais du premier coup :wink:

Re: utilisation de "function"

Posté : 23 sept. 2010, 02:28
par Gakman
Merci ton aide !
Tel quel ça ne fonctionne pas mais je vais regarder demain, trop fatigué pour comprendre le code visiblement ce soir :lol:.

Re: utilisation de "function"

Posté : 23 sept. 2010, 02:29
par stealth35
Merci ton aide !
Tel quel ça ne fonctionne pas mais je vais regarder demain, trop fatigué pour comprendre le code visiblement ce soir :lol:.
t'as une erreur en sortie ?

Re: utilisation de "function"

Posté : 23 sept. 2010, 13:57
par Gakman
Alors j'ai un message :

Code : Tout sélectionner

Notice: Undefined index: category in /mnt/159/sdd/c/3/-/index3.php on line 55 Notice: Undefined index: lieu in /mnt/159/sdd/c/3/-/index3.php on line 55 Notice: Undefined index: date in /mnt/159/sdd/c/3/-/index3.php on line 55 Notice: Undefined index: category in /mnt/159/sdd/c/3/-/index3.php on line 58 Notice: Undefined index: category in /mnt/159/sdd/c/3/-/index3.php on line 59 Notice: Undefined index: lieu in /mnt/159/sdd/c/3/-/index3.php on line 59 -> ces 6 lignes répétées 3 fois au total
(J'ai mis - pour remplacer mon identifiant Free)

Pour isoler le soucis je travail sur un fichier index3.php et une nouvelle direction heberg2/ (que j'ai indiquée dans le code) où je peux facilement ajouter, enlever ou renommer les dossiers. Pour tester là j'ai juste créé un dossier "2010-famille+ben" car il me semble que c'est ainsi que tu compris la structure des nom de mes dossiers.

A ce propos le nom de mes dossiers est assez compliqué (schématiquement : date-catégorie+nom), c'était pour pouvoir faire un classement par catégorie et date. Mon code faisait : lister les noms de dossiers, les classer (donc par date puisqu'elle est au début), et afficher par catégorie la liste des noms (ce qu'il y a après le +). Je pense qu'en expliquant le but c'est plus facilement compréhensible, car j'utilise tout au long de mon code original des mayens détournés car je en connais pas beaucoup de commandes PHP.

J'ai bien suivi ton code et il est en effet beaucoup plus élégant que le mien :lol:. J'ai regardé le fonctionnement et j'ai compris la logique. Il y a juste au niveau du switch que je dois encore voir l'affichage.Par contre je ne vois pas l'erreur.



Pour mon problème initial, j'avais oublié de mettre global $liste; dans la fonction... Je viens de m'en rendre compte.
Mais vu ce que tu me proposes comme code, je vais poursuivre pour essayer de faire fonctionner à ta manière, se sera beaucoup mieux !