Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/09/2011, 12h43   #1
Membre éprouvé
 
Avatar de gtraxx
 
Homme Aurélien Gérits
Développeur Web
Inscription : mai 2006
Messages : 1 045
Détails du profil
Informations personnelles :
Nom : Homme Aurélien Gérits
Âge : 30
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2006
Messages : 1 045
Points : 498
Points : 498
Par défaut Supprimer des éléments de tableau

Bonjour, je souhaite supprimer un ou plusieurs éléments de tableau mais je ne sais pas si ma méthode est très optimisé.

Cette fonction ne supprime qu'un seul élément à la fois, je me suis dit que peut être pourrais utiliser un système pour les exclusions avec un autre tableau.
Mais au niveau performance sa me semble pas génial:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private function array_delete_key($array,$search) {
		$temp = array();
		foreach($array as $key => $value) {
			 if($key!=$search) {
			 	$temp[$key] = $value;
			 }
		}
		return $temp;
	}
	public function tabs_encode($params,$exclude=''){
		if(is_array($params)){
			foreach ($params as $key=>$value){
				if($exclude != ''){
					$tabs = $this->array_delete_key($value, $exclude);
				}else{
					$tabs = $value;
				}
				$result[]=$tabs;
			}
			return $result;
		}
	}
N'y aurai-t-il pas une méthode plus propre mais qui supprime autant d'élément que je le souhaite ?
Je me demande aussi si c'est possible de transformer un élément de tableau avant de le renvoyer ?
par exemple un des éléments est un énorme texte et je dois appliquer une fonction pour simplement retourner un oui ou non à la place de celui-ci.
Donc supposons que je souhaite purement et simplement le remplacer par autre chose sans pour autant toucher au reste
__________________
Au petit déjeuner, je prend du PHP et au souper du jQuery.
AFUP 2009 : Bien optimiser son code pour le référencement
Mon projet open source de librairie PHP 5: magix cjquery
gtraxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 16h41   #2
Rédacteur/Modérateur
 
Avatar de Thes32
 
Homme
Développeur Web
Inscription : décembre 2006
Messages : 2 335
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2006
Messages : 2 335
Points : 3 774
Points : 3 774
salut,

tu peux faire un test avec isset ensuite faire un unset.
__________________
Développeur | Zend Certified Engineer

Étapes Pour mieux se servir du forum:
1. Commencez par lire les cours et tutoriels ;
2. Faites une recherche;
3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

Nix>_Rien n'est plus pratique que la théorie
Thes32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 17h09   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 032
Points : 5 032
Citation:
N'y aurai-t-il pas une méthode plus propre mais qui supprime autant d'élément que je le souhaite ?
Cette méthode est selon moi la plus simple:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
function delete_value_from_array (array &$arr, $value = false, $strict = false) {
  $c = 0;
  foreach (array_keys($arr, $value, $strict) as $key) {
     $c++;
     unset($arr[$key]);
  }
  return $c;
}
 
$a = array(1,1,1,1,1,2,1,1,1,3);
var_dump(delete_value_from_array($a, 1));
var_dump($a);
On peut légèrement la modifier pour accepter un tableau de valeurs à supprimer:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
function delete_values_from_array (array &$arr, array $values) {
  $c = 0;
  foreach (array_intersect($arr, $values) as $key => $value) {
     $c++;
     unset($arr[$key]);
  }
  return $c;
}
 
$a = array(1,1,1,1,1,2,1,1,1,3);
var_dump(delete_value_from_array($a, array(1,2)));
var_dump($a);
Pour info, si on connait les clés, le moyen le plus rapide pour supprimer une (ou plusieurs) entrées est:
Code :
if (isset($arr[$key])) unset($arr[$key]);
Si tu veux faire des remplacements à la volée, regarde du coté de array_map ou array_walk:
Code :
1
2
3
4
5
6
7
8
$a = array(1,2,3,4,5,6,7,8,9);
 
// Remplaçons les nombres paires par 'oui' et impaires par 'non'
array_walk($a, function (&$item, $key) {
  $item = ($item %2 == 0) ? 'Oui' : 'Non';
});
 
var_dump($a);
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 17h30   #4
Rédacteur/Modérateur
 
Avatar de Thes32
 
Homme
Développeur Web
Inscription : décembre 2006
Messages : 2 335
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2006
Messages : 2 335
Points : 3 774
Points : 3 774
Citation:
Envoyé par Benjamin Delespierre Voir le message

Pour info, si on connait les clés, le moyen le plus rapide pour supprimer une (ou plusieurs) entrées est:
Code :
if (isset($arr[$key])) unset($arr[$key]);
Le seul point négatif avec isset c'est au niveau des éléments avec des valeurs NULL qui retourne false. Dans ce cas il vaut mieux utiliser array_key_exists. Si tu es sûre que ton tableau ne stockera pas des valeurs NULL tu ferais mieux d'utiliser isset vu qu'elle est plus rapide.
__________________
Développeur | Zend Certified Engineer

Étapes Pour mieux se servir du forum:
1. Commencez par lire les cours et tutoriels ;
2. Faites une recherche;
3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

Nix>_Rien n'est plus pratique que la théorie
Thes32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 08h54   #5
Membre éprouvé
 
Avatar de gtraxx
 
Homme Aurélien Gérits
Développeur Web
Inscription : mai 2006
Messages : 1 045
Détails du profil
Informations personnelles :
Nom : Homme Aurélien Gérits
Âge : 30
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2006
Messages : 1 045
Points : 498
Points : 498
Bonjour et merci, je suis entrain de tester mais malheureusement cela ne fonctionne pas.
J'utilise des clés sous forme de chaine et en essayant ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
function delete_values_from_array (array &$arr, array $values) {
  $c = 0;
  foreach (array_intersect($arr, $values) as $key => $value) {
     $c++;
     unset($arr[$key]);
  }
  return $c;
}
 
$a = array(1,1,1,1,1,2,1,1,1,3);
var_dump(delete_value_from_array($a, array(1,2)));
var_dump($a);
Il ne me retourne que des 0
Mon tableau ressemble à ceci :
Code :
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
 
Array
(
    [0] => Array
        (
            [idnews] => 2
            [keynews] => C4uIsrvvpyBGn7BYtyve
            [n_title] => le truc du mois
            [n_content] =>  elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
            [idlang] => 1
            [n_image] => 1fhdkj1dfycks00k004.jpg
            [date_register] => 2011-06-09 12:06:17
            [date_publish] => 0000-00-00 00:00:00
            [published] => 0
            [iso] => fr
        )
 
    [1] => Array
        (
            [idnews] => 1
            [keynews] => kjuAX7Vb3o3XbkjlbpSS
            [n_title] => pirate des caraïbes 4 enfin sorti
            [n_content] => Lorem ipsum dolor
            [idlang] => 1
            [n_image] => piny9upl8u808s0wo.png
            [date_register] => 2011-06-09 10:40:06
            [date_publish] => 2011-06-09 13:46:14
            [published] => 1
            [iso] => fr
        )
 
)
Ce que je souhaite c'est par exemple supprimer la clé n_content mais continuer de retourner le reste.
Dans une évolution je dois également être capable de modifier cette entrée donc par exemple pour le moment n_content est une chaine mais je souhaite pourquoi pas la remplacer par null ou pas null.
une idée ?

Voici les fonctions vous allez imaginer directement ce que je tente de faire:

Code :
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
 
private function array_delete_key($array,$search,$debug) {
		//$temp = array();
		foreach($array as $key) {
			/*if($key!=$search) {
		 		$temp[$key] = $value;
			}*/
			unset($array[$search]);
		}
		return $array;
	}
	public function tabs_json_encode($params,$exclude='',$debug=false){
		if(is_array($params)){
			$result = array();
			foreach ($params as $key){
				if($debug!=false){
					$firebug = new magixcjquery_debug_magixfire();
					$firebug->magixFireDump('Dump json encode', $params);
				}
				if($exclude != ''){
					$tabs = $this->array_delete_key($key, $exclude,$debug);
				}else{
					$tabs = $key;
				}
				$result[]= json_encode($tabs);
			}
			$this->stack_error();
			return $result;
		}
	}
En faites mon système va me permettre de travailler pour avoir un format json en retour, donc si je travail correctement sur les tableaux avant l'encodage, je pense avoir quelque chose de déjà pas mal
__________________
Au petit déjeuner, je prend du PHP et au souper du jQuery.
AFUP 2009 : Bien optimiser son code pour le référencement
Mon projet open source de librairie PHP 5: magix cjquery
gtraxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 09h49   #6
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 032
Points : 5 032
Bon, vu que tu n'a pas l'air d'avoir compris mon post je vais me répéter:
Citation:
Pour info, si on connait les clés, le moyen le plus rapide pour supprimer une (ou plusieurs) entrées est:
Code :
if (isset($arr[$key])) unset($arr[$key]);
Citation:
Ce que je souhaite c'est par exemple supprimer la clé n_content mais continuer de retourner le reste.
...
Code :
1
2
3
4
foreach ($arr as $key => $subarr) {
  if (isset($subarr['n_content'])) {
    unset($arr[$key]['n_content']);
}
Note que je ne comprends toujours pas où est la difficulté...
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 11h17   #7
Membre éprouvé
 
Avatar de gtraxx
 
Homme Aurélien Gérits
Développeur Web
Inscription : mai 2006
Messages : 1 045
Détails du profil
Informations personnelles :
Nom : Homme Aurélien Gérits
Âge : 30
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2006
Messages : 1 045
Points : 498
Points : 498
Je le comprend bien, je ne suis peut être pas bien éveillé
J'ai essayer ceci :
Code :
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
 
public function tabs_json_encode($params,$arg=array('item'=>'','action'=>'','replace'=>array(1,0)),$debug=false){
		if(is_array($params)){
			$firebug = new magixcjquery_debug_magixfire();
			if($debug!=false){
				$firebug->magixFireDump('Dump json encode', $params);
			}
			foreach($params as $key => $val) {
				if($arg['action'] != ''){
					switch($arg['action']){
						case 'delete':
							if (isset($val[$arg['item']])) {
								unset($params[$key][$arg['item']]);
							}
						break; 
						case 'replace':
							if (isset($val[$arg['item']])) {
								if($params[$key][$arg['item']] != null){
									$params[$key][$arg['item']] = $arg['replace'][0];
								}else{
									$params[$key][$arg['item']] = $arg['replace'][1];
								}
							}
						break;
					}
				}
				$tabs = $params[$key];
				$result[]= json_encode($tabs);
			}
			$this->stack_error();
			return $result;
		}else{
			throw new Exception('tabs json is not array :'.$params);
		}
	}
Ceci fonctionne bien pour une seule valeur mais pas pour un tableau de valeur (en chaine).
mon tableau est assez particulier sachant qu'ensuite il faut que je puisse y caser un replace ou str_replace
__________________
Au petit déjeuner, je prend du PHP et au souper du jQuery.
AFUP 2009 : Bien optimiser son code pour le référencement
Mon projet open source de librairie PHP 5: magix cjquery
gtraxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h50.


 
 
 
 
Partenaires

Hébergement Web