Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Site Web > PHP > Vos Fonctions ou astuces > Lecture du sujet

Vos Fonctions ou astuces

Vous devez être inscrit pour pouvoir poster des messages

Page : Précédente  1  2  3  ...  84  85  86  87  88  89  90  ...  97  98  99  100  Suivante
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : Précédente  1  2  3  ...  84  85  86  87  88  89  90  ...  97  98  99  100  Suivante
Hors ligne Artefact2 # Posté le 30/05/2008 à 22:25:04
C'est toi le bouc !
Avatar
Groupe : Membres
Reprise du dernier message de la page précédente :
Citation : Asibasth
Puis je préfère utiliser l'opérateur de pré-incrémentation qui rend impossible ce genre de syntaxe.


Ouaip, en plus c'est plus rapide :D
 
Hors ligne Jeremie78 # Posté le 30/05/2008 à 22:26:27
Powered by GNU/Linux
Groupe : Membres
Citation : Artefact2
Citation : Asibasth
Puis je préfère utiliser l'opérateur de pré-incrémentation qui rend impossible ce genre de syntaxe.


Ouaip, en plus c'est plus rapide :D



Wahou, tu vas gagner 0.000000001 ms :)

Web-Modules : outils pour webmasters (compteurs, tchat, news ...) à installer sur son site, générateur de bannières, de userbars, ...
 
Hors ligne Artefact2 # Posté le 30/05/2008 à 22:48:59
C'est toi le bouc !
Avatar
Groupe : Membres
Citation : Jeremie78
Citation : Artefact2
Citation : Asibasth
Puis je préfère utiliser l'opérateur de pré-incrémentation qui rend impossible ce genre de syntaxe.


Ouaip, en plus c'est plus rapide :D



Wahou, tu vas gagner 0.000000001 ms :)


Fais le calcul quand tu as de grosses boucles et un serveur bien chargé. Toute optimisation est bonne à prendre, si tu as des ressources à perdres c'est ton problème :)

Dans 99% des cas on se contrefiche de la différence entre $x++ et ++$x.
 
Hors ligne prototype01 # Posté le 31/05/2008 à 09:10:11
Avatar
Groupe : Membres
Citation : Artefact2
Citation : Jeremie78
Citation : Artefact2
Citation : Asibasth
Puis je préfère utiliser l'opérateur de pré-incrémentation qui rend impossible ce genre de syntaxe.


Ouaip, en plus c'est plus rapide :D



Wahou, tu vas gagner 0.000000001 ms :)


Fais le calcul quand tu as de grosses boucles et un serveur bien chargé. Toute optimisation est bonne à prendre, si tu as des ressources à perdres c'est ton problème :)

Dans 99% des cas on se contrefiche de la différence entre $x++ et ++$x.


Étant un topic d'astuces, il serait bon d'expliquer tout cela.
 
Hors ligne Artefact2 # Posté le 31/05/2008 à 11:32:15
C'est toi le bouc !
Avatar
Groupe : Membres
Ok, j'explique :

Quelle est la différence entre l'opérateur de post-incrémentation et celui de pré-incrémentation ? La voici :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php

$i = 10;

echo $i++; // Le "++" est situé après $i donc cette opération renvoie $i AVANT l'incrémentation.
// On affiche donc : 10.

// Ici, $i vaut quand même 11.

$i = 10;

echo ++$i; // Le "++" est situé avant $i donc on incrémente puis on renvoie la nouvelle valeur.
// On affiche donc : 11.


Et, quand on a pas besoin de cette subtile différence (dans une boucle for par exemple), il est préférable d'utiliser ++$x car il est (un peu) plus rapide. Certes c'est pas grand chose, mais si on a une grosse boucle cette opération sera exécutée beaucoup de fois et le temps gagné ne sera plus négligeable.

Petit test :

Citation : Benchmark
Itérations : 10000000

Début du test avec for $x++... Fin du test : 3.95727 secondes

Début du test avec for ++$x... Fin du test : 3.65176 secondes


Et le code :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php 

define(ITERATIONS, 10000000);

echo '<pre>';

echo 'Itérations : '.ITERATIONS."\n\n";

echo "Début du test avec for \$x++... ";
$Temps = microtime(true);

for($x = 0; $x < ITERATIONS; $x++)
{
	// Do nothing !
}

$TempsFin = microtime(true);

echo 'Fin du test : '.round($TempsFin - $Temps, 5)." secondes\n\n";


echo "Début du test avec for ++\$x... ";
$Temps = microtime(true);

for($x = 0; $x < ITERATIONS; ++$x)
{
	// Do nothing !
}

$TempsFin = microtime(true);

echo 'Fin du test : '.round($TempsFin - $Temps, 5)." secondes\n\n";

echo '</pre>';
 
Hors ligne Clems # Posté le 31/05/2008 à 11:47:15
Sbrouf
Avatar
Groupe : Membres
Ok, merci, c'est toujours bon à savoir, bien que l'intéret me semble moindre ^^

J'ai rarement besoin de faire des boucles à 10 millions d'itérations :D , et si on fait le calcul, ++$i prends 0.00000003 secondes de moins :p
Mais merci quand même ;)
Édité le 31/05/2008 à 11:47:33 par Clems
 
Hors ligne Jeremie78 # Posté le 31/05/2008 à 11:53:31
Powered by GNU/Linux
Groupe : Membres
Eh oui !

Ce genre d'optimisation ne sert presque à rien, comparé à une optimisation de son SGBD, l'insertion d'un système de cache, ...

Autant dire ce qui est : optimiser OUI. Mais encore faut-il que cela ait encore un sens ...

Web-Modules : outils pour webmasters (compteurs, tchat, news ...) à installer sur son site, générateur de bannières, de userbars, ...
 
Hors ligne croky # Posté le 31/05/2008 à 12:13:29
Graor!
Groupe : Membres
Citation : Benchmark
Itérations : 1000

Début du test avec for $x++... Fin du test : 0.00016 secondes

Début du test avec for ++$x... Fin du test : 0.00015 secondes

Avec 1 000 itérations, il n'y a que 10 millisecondes de gagnées. De plus, qui a déjà réellement eu besoin de faire un boucle à 10 millions d'itérations ? o_O
Hors ligne Jeremie78 # Posté le 31/05/2008 à 12:24:20
Powered by GNU/Linux
Groupe : Membres
Bof ... chez moi en 1000 itérations, je gagne 0,01 ms !!
Pas de quoi casser 3 pattes à un canard en somme.
Édité le 31/05/2008 à 12:29:09 par Jeremie78

Web-Modules : outils pour webmasters (compteurs, tchat, news ...) à installer sur son site, générateur de bannières, de userbars, ...
 
Hors ligne DrY_GiN # Posté le 31/05/2008 à 12:27:47
Avatar
Groupe : Membres
0.00016 - 0.00015 = 0.00001 = 0,01 ms si ne ne m'abuse
Hors ligne orklah # Posté le 31/05/2008 à 12:32:25
Avatar
Groupe : Membres
Vous passez par un site pour faire ces tests ou vous faites sa chez votre hebergeur?
 
Hors ligne Artefact2 # Posté le 31/05/2008 à 12:44:21
C'est toi le bouc !
Avatar
Groupe : Membres
Ben c'est toujours mieux de choisir la solution la plus rapide.

Comme on dit "y'a pas de petit profit".
 
Hors ligne Jeremie78 # Posté le 31/05/2008 à 12:48:15
Powered by GNU/Linux
Groupe : Membres
Citation : Artefact2
Ben c'est toujours mieux de choisir la solution la plus rapide.

Comme on dit "y'a pas de petit profit".

Certes mais disons qu'il faudra y penser pour la prochaine fois. Y a pas de quoi changer tout ses scripts en pensant faire un économie monstre :) .

Web-Modules : outils pour webmasters (compteurs, tchat, news ...) à installer sur son site, générateur de bannières, de userbars, ...
 
Hors ligne Savageman # Posté le 31/05/2008 à 13:17:20
Insa : If inside
Avatar
Groupe : Membres
Petite mise au point : ++$i utilise 3 opcode et $i++ en utilise 4, d'où la différence.
Cependant, n'importe quel optimiseur PHP transforme les 4 opcode de $i++ en 3 opcode de ++$i, donc à partir du moment où vous avez un accélérateur PHP, ça ne change STRICTEMENT RIEN.
En somme, ne changez rien, utilisez un optimiseur... (inclue par défaut fans PHP 6, c'est pas trop tôt...).
 
Hors ligne Artefact2 # Posté le 31/05/2008 à 13:18:10
C'est toi le bouc !
Avatar
Groupe : Membres
Citation : Savageman
Petite mise au point : ++$i utilise 3 opcode et $i++ en utilise 4, d'où la différence.
Cependant, n'importe quel optimiseur PHP transforme les 4 opcode de $i++ en 3 opcode de ++$i, donc à partir du moment où vous avez un accélérateur PHP, ça ne change STRICTEMENT RIEN.
En somme, ne changez rien, utilisez un optimiseur... (inclue par défaut fans PHP 6, c'est pas trop tôt...).


J'ai jamais réussi à utiliser E-accelerator ou autres :(
 
Hors ligne Jerry Wham # Posté le 02/06/2008 à 17:26:34
1castorMangé,1arbreSauvé
Avatar
Groupe : Membres
Auteur: Jerry Wham
Type: Astuce
But: Ajouter des jours à une date, lorsque date_modify() ne fonctionne pas
Code:

Exemple : ajouter 10 jours à une date initiale :

Code : PHP
1
2
3
4
5
6
7
<?php
$date_depart = '2008-03-24';
$new_date = date_parse($date_depart);
$new_date = date('Y-m-d',mktime(0,0,0,$new_date['month'], $new_date['day']+10, $new_date['year']));
echo $date_depart.'<br/>';
echo $new_date;
?>


Ce qui donne

2008-03-24
2008-04-03

Même principe pour ajouter des mois ou des années. Le format de sortie est modifiable (Y-m-d, d m Y, d/m/Y, d-m-Y etc.). ;)
 
Hors ligne JeromeJ # Posté le 02/06/2008 à 17:59:01
Avatar
Groupe : Membres
strtotime n'est-il pas aussi une (meilleure) solution ?

À la seule condition de connaitre un minimum son utilisation et sa syntaxe (voir un ptit peu d'anglais :D ) (cf. le lien)

EDIT:
je pense néanmoins qu'il utilise moins de valeurs inutiles mais son utilisation est peut-être quand même plus lourdes, j'en sais rien, ai pas fais de bench. Puis si il se révèle que strtotime est finalement plus optimal, pour la difficulté d'utilisation une ptite fonction utilisateur pourrait résoudre le prob :) non ?
Édité le 02/06/2008 à 18:02:34 par JeromeJ








Secret (cliquez pour afficher)
Ce que je maitrise actuellement: XHTML, CSS, PHP, Action Script 2 et 3, JavaScript, SQL, Python, et un peu de C, C++ et d'erl
 
Hors ligne Jerry Wham # Posté le 02/06/2008 à 18:04:33
1castorMangé,1arbreSauvé
Avatar
Groupe : Membres
Citation : JeromeJ
strtotime n'est-il pas aussi une (meilleure) solution ?

À la seule condition de connaitre un minimum son utilisation et sa syntaxe (voir un ptit peu d'anglais :D ) (cf. le lien)


Non je ne pense pas. Car au départ, la chaine que j'utilise n'est pas une phrase mais une date qui peut varier. De plus, Citation : manuel php
mktime() est pratique pour faire des calculs de dates et des validations, car elle va automatiquement corriger les valeurs invalides.

Enfin, la valeur retournée a la même "forme" que celle du début (aaa-mm-dd), et ce n'est pas un timestamp.
Édité le 02/06/2008 à 18:06:55 par Jerry Wham
 
Hors ligne JeromeJ # Posté le 02/06/2008 à 18:21:48
Avatar
Groupe : Membres
On peut aussi faire tout aussi bien avec strtotime... le truc c'est que date_parse déjà te donne plus de variable que nécessaire.
Ensuite moi il suffirait d'associer date et strtotime (2 fonctions et cela sans variable obligatoire tandis que toi c'est 3 fonctions et des variables :D Bon maintenant je dis peut-être n'importe quoi. Faut voir)








Secret (cliquez pour afficher)
Ce que je maitrise actuellement: XHTML, CSS, PHP, Action Script 2 et 3, JavaScript, SQL, Python, et un peu de C, C++ et d'erl
 
Hors ligne Savageman # Posté le 02/06/2008 à 18:54:40
Insa : If inside
Avatar
Groupe : Membres
Et tu crois que strtotime() ne corrige pas les erreurs invalides ?
Moi je préfères largement ça :
Code : PHP
1
2
3
4
5
6
<?php
$date_depart = strtotime('2008-03-24');
$new_date = strtotime('+10 days', $date_depart);

echo strftime('%Y-%m-%d', $date_depart);
echo strftime('%Y-%m-%d', $new_date);
 
Hors ligne tryks # Posté le 04/06/2008 à 14:49:03
Vis tibi adsit !
Groupe : Membres
Reinitialiser une de ses tables (avec un auto-increment) afin que celui-ci repasse à 0
Code : SQL
1
TRUNCATE nomdelatable
</code>
 
Hors ligne shine-neko # Posté le 04/06/2008 à 14:55:14
Saite ita no wa My Rosy Heart
Avatar
Groupe : Membres
Citation : tryks
Reinitialiser une de ses tables (avec un auto-increment) afin que celui-ci repasse à 0
Code : SQL
1
TRUNCATE nomdelatable
</code>


ça consiste a vider la table :-°

La v3 de Shine-Shiina est sortit
Qui n'a jamais rêver d'apprendre a dessiner , Cuisiné japonnais dévorer de nouveaux manga fait par des copains et d'apprendre le japonais ?
=> La réponse se trouve ici
Image utilisateur

 
Hors ligne gerald57 # Posté le 04/06/2008 à 15:06:44
Groupe : Membres
bonjour,

Script qui m'a bien aider, importer une base interbase vers mysql par connexion odbc. A adapter bien surCode : PHP
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
<?php
header("Cache-Control: no-cache");
include ("tblnote.php");
#######################################################
#           SCRIPT DE CONVERSION DE BDD               #
#               INTERBASE -> MYSQL                    #
#             le 19/05/2008 par Gérald GAIGA                  #

#######################################################
#FONCTIONS

function TypeChamp ($champ,$taille) {
    switch ($champ) {
     case 7:
     return array('SMALLINT',$taille);
     break;
     case 8:
     return array('INT',$taille);
     break;
     case 16:
     return array('BIGINT',$taille);
     break;
     case 10:
     return array('FLOAT','');
     break;
     case 11:
     //return 'D_Float';
     return 'erreur';
     break;
     case 27:
     return array('DOUBLE','');
     break;
     case 9:
     //return 'Quad';
     return 'erreur';
     break;
     case 14:
     return array('CHAR',$taille);
     break;
     case 37:
     return array('VARCHAR',$taille);
     break;
     case 40:
     //return 'CString';
     return 'erreur';
     break;
     case 13:
     return array('TIME','');
     break;
     case 12:
     return array('DATE','');
     break;
     case 35:
     return array('TIMESTAMP','');
     break;
     case 261:
     return array('BLOB','');
     break;
    }
}
#FIN FONCTIONS
#PARAMETRES
//C'est ici que vous devez entrer les paramètres de connexions aux BDD InterBase et MySQL
//Assurez-vous d'avoir un serveur InterBase (ex: Firebird) et MySQL (ex: EasyPHP, WAMP) en activité.
//PARAMETRES INTERBASE

  $hote = 'SIC'; //nom du dsn
  $utilisateur = 'SYSDBA'; //User par défaut
  $passe ='syscreas'; //Pass par défaut
  $bdd_interbase = odbc_connect($hote, $utilisateur, $passe, 'IscDbc'); //Connexion
//PARAMETRES MYSQL
  $hote_mysql = 'localhost';
  $utilisateur_mysql = 'admin';
  $passe_mysql = '123456';
  $nom_mysql = 'test'; //Nom de la BDD MySQL
  mysql_query('DROP DATABASE test');
 mysql_query( 'CREATE DATABASE test');
 
  $bdd_mysql = mysql_connect($hote_mysql,$utilisateur_mysql,$passe_mysql);
  mysql_select_db($nom_mysql,$bdd_mysql);
  
#FIN PARAMETRES
//ON PARCOURT LA BDD INTERBASE
 

  //ON PARCOURT LA BDD INTERBASE
  $requete = 'SELECT DISTINCT rdb$relation_name FROM rdb$relation_fields
WHERE rdb$view_context IS NULL
AND rdb$system_flag = 0';
  $resultat = odbc_do($bdd_interbase, $requete);
  
  
$result = odbc_columns($bdd_interbase, $hote, "","", "%");


  //Récupérer le noms des champs
  //Initialisation
$k=0;
//Connection
while ($ligne = odbc_fetch_array($resultat)) {
$result = odbc_columns($bdd_interbase, $hote, "", "%");
}
//Récupération du nom des colonnes
while (odbc_fetch_array($result)) {
   
  $tablechamp[$k]= odbc_result($result,"COLUMN_NAME");
  
  
  echo ($tablechamp[k]);
  $k++;

}


  

  
  //Boucle
  $i=0;
  while ($ligne = odbc_fetch_array($resultat)) {
   
    foreach ($ligne AS $table) {
    
    $req_struc_table = 'SELECT *
                        FROM rdb$relations rel
                          JOIN rdb$relation_fields rel_field
                            ON rel_field.rdb$relation_name = rel.rdb$relation_name
                          JOIN rdb$fields field
                            ON rel_field.rdb$field_source = field.rdb$field_name
                        WHERE rel.rdb$relation_name = \''.$table.'\'
                        ORDER BY rel_field.rdb$field_position, rel_field.rdb$field_name';
       $res_struc_table = odbc_do($bdd_interbase,$req_struc_table);
   //initialisation

       //Construction de la requête de création de la table
   



       $req_create_table = "CREATE TABLE `".trim($table)."` (";
  
       while ($tab_struc_table = odbc_fetch_array($res_struc_table) ) {
	    
         $struct_champ = TypeChamp($tab_struc_table['RDB$FIELD_TYPE'],$tab_struc_table['RDB$FIELD_LENGTH']);
         if ($prem) {
            $req_create_table .= " , ";
         } else { $prem = 1; }
echo($tablechamp[$i]);
         $req_create_table .= "`".trim($tablechamp[$i])."` ".$struct_champ[0];
         if ($struct_champ[1]) {
            $req_create_table .= "(".$struct_champ[1].")";
         }
         if ($tab_struc_table['RDB$NULL_FLAG'] == 0) {
            $req_create_table .= " NULL";
         } else {
            $req_create_table .= " NOT NULL";

         }
$i++;
}
       
   
       $req_create_table .= ") ENGINE = MyISAM";
  
       unset($prem);
       mysql_query($req_create_table) or die ("Impossible de créer la table : ".mysql_error()."<br>Requete : ".$req_create_table);
       
       odbc_free_result($res_struc_table);
       $requete2 = 'SELECT * FROM '.$table; //On récupère les champs de la table et leurs valeurs
       $resultat2 = odbc_do($bdd_interbase, $requete2);
       while ($ligne2 = odbc_fetch_array($resultat2)) {
          //Construction de la requête d'insertion des données
          $req_insert = "INSERT INTO `".trim($table)."` SET ";
          foreach ($ligne2 AS $champ => $valeur) {
            if ($prem) {
               $req_insert .= " , ";
            } else { $prem = 1; }
            #Correction des valeurs texte
            $valeur = str_replace("\'","'",$valeur);
            $valeur = utf8_decode($valeur);
            $req_insert .= "`".$champ."`='".addslashes($valeur)."'";
          }
          unset($prem);
          mysql_query($req_insert) or die ("Insertion impossible : ".mysql_error()."<br>Requete : ".$req_insert);
          
      }
    }
  }
  odbc_free_result($resultat);
  
  odbc_close($bdd_interbase);
?>

</body> 
</html>
Hors ligne Artefact2 # Posté le 04/06/2008 à 18:11:17
C'est toi le bouc !
Avatar
Groupe : Membres
Citation : tryks
Reinitialiser une de ses tables (avec un auto-increment) afin que celui-ci repasse à 0
Code : SQL
1
TRUNCATE nomdelatable
</code>


Ouaaaah elle déchire ton astuce.
 
Hors ligne JeromeJ # Posté le 07/06/2008 à 18:18:38
Avatar
Groupe : Membres
Auteur: JeromeJ
Type: Fonction
But: strpos amélioré (permet de chercher après d'autres occurrences que la première)
Code:
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
function strpos_r($str, $needle, $n)
{
	static $recursive = false; // Pour ne pas avoir à refaire les vérifications (inutilement à chaque fois)
	static $start = 0;
	
	if(!$recursive)
	{
		if(!is_int($n)) error('$n (arg[2]) must be a int', __FUNCTION__);
		else if($n == 0) error('$n (arg[2]) must be different than 0', __FUNCTION__);
		else if($n < 0) return strrpos_r($str, $needle, abs($n)); // Pour un éventuel strrpos récursif
	}
	
	$ret = strpos($str, $needle);
	
	if($ret === false)
	{
		// On ré-initialise la session
		$recursive = false;
		$start = 0;
		
		return false;
	}
	else if($n == 1)
	{
		$ret += $start;
		
		// On ré-initialise la session
		$recursive = false;
		$start = 0;
		
		return $ret;
	}
	
	$recursive = true;
	$start += $ret;
	
	return strpos_r(substr($str, $start+1), $needle, $n-1)+1;
}
?>

Exemple:
Code : PHP
1
2
3
<?php
echo strpos_r('lol/beuh/shit/mdr/loul... <:D', '/', 2);
?>

Citation : Rendu
8


Que pensez-vous de mon nouveau prototype ? :)
Édité le 09/06/2008 à 18:08:20 par JeromeJ








Secret (cliquez pour afficher)
Ce que je maitrise actuellement: XHTML, CSS, PHP, Action Script 2 et 3, JavaScript, SQL, Python, et un peu de C, C++ et d'erl
 
Hors ligne Cortexd # Posté le 07/06/2008 à 19:03:07
Maouunnwww !
Avatar
Groupe : Membres
ce ne serait pas plus simple comme ceci :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
function nstrpos($string, $needle, $offset = 0, $n = 1)
{
	if ($n <= 1)
		return strpos($string, $needle, $offset);

	return nstrpos($string, $needle, strpos($string, $needle, $offset) + 1, $n - 1);
}

// affiche 8
echo nstrpos('lol/beuh/shit/mdr/loul... <:D', '/', 0, 2);
?>
Édité le 07/06/2008 à 20:06:07 par Cortexd

Comme l'or, il est caresse et volupté...
Image utilisateur Arrêt sur image


 
Hors ligne JeromeJ # Posté le 07/06/2008 à 21:02:51
Avatar
Groupe : Membres
Si, peut-être... Mais j'me suis dit autant éviter $offset vu que pour utiliser celui-ci il faut repasser toute la chaine en argument (ce qui peut-être très lourd si celle-ci est longue) c'était volontaire. Puis ma méthode introduit des vérification. C'est à voir.

Le mieux aurait ptet été de juste faire une boucle alors mais c'était assez complexe... :S
Édité le 07/06/2008 à 21:11:47 par JeromeJ








Secret (cliquez pour afficher)
Ce que je maitrise actuellement: XHTML, CSS, PHP, Action Script 2 et 3, JavaScript, SQL, Python, et un peu de C, C++ et d'erl
 
Hors ligne Cortexd # Posté le 07/06/2008 à 21:57:43
Maouunnwww !
Avatar
Groupe : Membres
garder $offset permet de rendre la fonction compatible avec celle d'origine et de conserver une fonctionnalité importante
sinon vu qu'au cœur de la fonction tu es obligé d'utiliser la fonction strpos(), c'est cette dernière qui va vérifier les erreurs finalement
et en boucle non récursive ça donne ça :
Code : PHP
1
2
3
4
5
6
7
8
9
<?php
function nstrpos($string, $needle, $offset = 0, $n = 1)
{
	--$offset;

	while (($offset = strpos($string, $needle, $offset + 1)) !== false and --$n > 0);

	return $offset;
}

Comme l'or, il est caresse et volupté...
Image utilisateur Arrêt sur image


 
Hors ligne JeromeJ # Posté le 08/06/2008 à 14:48:20
Avatar
Groupe : Membres
Ok t'a gagné :D Je propose juste d'inverser $offset et $n, de laisser $offset à 0 par défaut et d'obliger de mettre une valeur pour $n, la fonction étant prévue à cette effet à la base, ça serait donc plus logique








Secret (cliquez pour afficher)
Ce que je maitrise actuellement: XHTML, CSS, PHP, Action Script 2 et 3, JavaScript, SQL, Python, et un peu de C, C++ et d'erl
 
Hors ligne JeromeJ # Posté le 09/06/2008 à 18:08:34
Avatar
Groupe : Membres
Auteur: JeromeJ
Type: Fonction
But: Même effet que la fonction compact mais sur n'importe quel array (pas seulement $GLOBALS)
Code:
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
function compact2(&$from)
{
	for($i = 1, $count = func_num_args(); $i < $count; $i++)
		for($i2 = 0, $tmp = (array)func_get_arg($i), $count2 = count($tmp); $i2 < $count2; $i2++)
			$array[$tmp[$i2]] = $from[$tmp[$i2]];
	
	return $array;
}
?>

Exemple:
Code : PHP
1
2
3
<?php
echo '<pre>',print_r(compact2($_SERVER, array('REQUEST_URI', 'QUERY_STRING', 'SCRIPT_NAME', 'PHP_SELF', 'PATH_INFO')), 1),'</pre>';
?>

Citation : Rendu
Array
(
....[REQUEST_URI] => ///test.php//TEST?testVar=333
....[QUERY_STRING] => testVar=333
....[SCRIPT_NAME] => /test.php
....[PHP_SELF] => /test.php//TEST
....[PATH_INFO] => /TEST
)








Secret (cliquez pour afficher)
Ce que je maitrise actuellement: XHTML, CSS, PHP, Action Script 2 et 3, JavaScript, SQL, Python, et un peu de C, C++ et d'erl
 
Hors ligne Cortexd # Posté le 09/06/2008 à 19:16:19
Maouunnwww !
Avatar
Groupe : Membres
encore une fois quelques remarques :p
pourquoi passer le tableau par référence ? tu ne le modifies pas dans la fonction
si un des arguments désigne un index qui n'existe pas, une notice sera déclenchée puisque tu ne vérifies pas son existence
et inutile de réinventer des fonctions qui existent déjà !
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
function compact3($from)
{
	$array = array();

	foreach (array_slice(func_get_args(), 1) as $arg)
		$array += array_intersect_key($from, array_flip((array)$arg));

	return $array;
}

Comme l'or, il est caresse et volupté...
Image utilisateur Arrêt sur image


 

Retour au forum "PHP" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 90 Zéros connectés | Requêtes SQL 6 requêtes | Temps de génération de la page : Total (SQL) 0.2655s (0.2498s)