Page 1 sur 1

Array multidimensionnel

Posté : 25 mai 2019, 14:20
par yoann38
Salut tout le monde voilà je cherche à récupérer la valeur d'un tableau qui se présente ainsi :
Je récupère sur ma page par exemple : trottinette via UN GET,
Maintenant j'aimerais pouvoir récupérer pratique issu donc du tableau aCategorie mais franchement je bloque la
// Array des Catégories
$aCategorie= array(
1 => array(1 => 'voiture', 2 => 'pratique')
);

// Array des Catégories
$aSous_Categorie = array(
1 => array(1 => 'berline', 2 => 'citadine', 3 => 'camion')
2 => array(4 => 'skate', 5 => 'trottinette')
);
Merci pour le coup de pouce

Re: Array multidimensionnel

Posté : 25 mai 2019, 14:26
par @rthur
Pratique est stocké dans $aCategorie[1][2] après quel lien tu fais avec la trottinette j'ai pas compris

Re: Array multidimensionnel

Posté : 25 mai 2019, 14:34
par Spols
pose toi la question si tes tableaux sont bien construit.

sinon parcours ton tableau $aSous_Categorie pour savoir si trotinette est dedans (in_array()) ensuite tu récupère l'index que tu utilise dans $aCategorie[1][index]

Re: Array multidimensionnel

Posté : 25 mai 2019, 15:10
par Saian
+1 pour les réponses de @rthur et Spols.
Mais tu pourrais simplifier la structure de tes tableaux en un seul comme ça :
$data = array(
  'voiture' => array('berline', 'citadine', 'camion'),
  'pratique' => array('skate', 'trottinette')
);

$search = 'trottinette';

foreach ($data as $category => $elements)
  if (in_array($search, $elements))
    break ;

echo $category;

EDIT : si tu ne peux ou ne veux pas changer la structure des tableaux :
// Array des Catégories
$aCategorie= array(
  1 => array(1 => 'voiture', 2 => 'pratique')
);

// Array des Catégories
$aSous_Categorie = array(
  1 => array(1 => 'berline', 2 => 'citadine', 3 => 'camion'),
  2 => array(4 => 'skate', 5 => 'trottinette')
);

$search = 'trottinette';

foreach ($aSous_Categorie as $categoryKey => $elements)
  if (in_array($search, $elements))
    break;

echo $aCategorie[1][$categoryKey];

Re: Array multidimensionnel

Posté : 25 mai 2019, 17:05
par yoann38
J'ai regardé un peu
j'arrive à ce que je souhaitais sauf une chose et je pense que les données rentre peut etre en conflit:
Exemple: dans ma variable $_GET['sous_categorie'] je récupère site pro qui est normalement issu donc de internet pourtant je récupère voyage. Je dois normalement récupèrer internet...
Ou se situe mon problème svp
// Array des Catégories
$aCategorie= array(
  1 => array(1 => 'internet', 2 => 'voyage')
);

// Array des Catégories
$aSous_Categorie = array(
  1 => array(1 => 'blog', 2 => 'site pro', 3 => 'site perso'),
  2 => array(4 => 'train', 5 => 'avion')
);

$search = $_GET['sous_categorie'];

foreach ($aSous_Categorie as $categoryKey => $elements)
  if (in_array($search, $elements))
    break;

echo $aCategorie[1][$categoryKey].'<br>'; // Categorie principale

foreach($aCategorie as $value) // Clé de la Categorie principale
{
  $key = key($aCategorie);
	echo $key;
}

Re: Array multidimensionnel

Posté : 25 mai 2019, 17:22
par Saian
Pas possible j'ai testé :
// Array des Catégories
$aCategorie= array(
  1 => array(1 => 'internet', 2 => 'voyage')
);

// Array des Catégories
$aSous_Categorie = array(
  1 => array(1 => 'blog', 2 => 'site pro', 3 => 'site perso'),
  2 => array(4 => 'train', 5 => 'avion')
);

//$search = $_GET['sous_categorie'];
$search = 'site pro';

foreach ($aSous_Categorie as $categoryKey => $elements)
  if (in_array($search, $elements))
    break;

echo $aCategorie[1][$categoryKey]."\n"; // Categorie principale

Et j'obtiens :
# php -f yoann38.php 
internet

Je pense plutôt que tu as un problème avec $_GET['sous_categorie'] (un espace en trop, un retour à la ligne, la casse qui est différente, ...) et que donc le foreach ne trouve rien et dans ce cas la valeur de $categoryKey est la valeur du dernier index de $aSous_Categorie soit 2 et tu obtiens donc voyage.

Tu peux gérer le problème comme ça :
//$search = $_GET['sous_categorie'];
$search = 'site pro ';

$found = false;
foreach ($aSous_Categorie as $categoryKey => $elements)
  if ($found = in_array($search, $elements))
    break ;

echo $found ? $aCategorie[1][$categoryKey]."\n" : "$search not found!\n"; // Categorie principale

Re: Array multidimensionnel

Posté : 26 mai 2019, 06:30
par yoann38
Effectivement le problème vien du GET que je récupère ( site perso ) par exemple
car lorsque je l'envoi dans le parametre je remplace l'espace entre site et perso par un - de ce fait je recupere
site-perso et non site perso.
Du coup je me retrouve bloqué car dans mon array j'ai des mots qui se retrouve eux avec des -

Re: Array multidimensionnel

Posté : 26 mai 2019, 10:49
par Saian
Ça alourdit un peu le traitement mais bon le tableau est petit :
//$search = $_GET['sous_categorie'];
$search = 'site-pro';

$found = false;
foreach ($aSous_Categorie as $categoryKey => $elements)
  if ($found = in_array($search, array_map(function ($entry) { return str_replace(' ', '-', $entry); }, $elements)))
    break ;

echo $found ? $aCategorie[1][$categoryKey]."\n" : "$search not found!\n"; // Categorie principale
array_map permet d'appliquer une fonction sur tous les éléments d'un tableau puis retourne le tableau transformé.
Si tu appliques la transformation à toutes les chaines, qu'elles contiennent des espaces ou non, ça fonctionnera très bien.

Si tu ne modifies que site perso tu peux ajouter une condition dans la fonction dans le array_map :
array_map(function ($entry) { return $entry == 'site perso' ? str_replace(' ', '-', $entry) : $entry; }, $elements)

Ou si tu ne modifies que certaines entrées :
array_map(function ($entry) { return in_array($entry, array('site perso', 'site pro') ? str_replace(' ', '-', $entry) : $entry; }, $elements)

Re: Array multidimensionnel

Posté : 13 juin 2019, 10:08
par yoann38
Re,
Du coup j'ai construit tout mon tableau
mais j'ai un resultat innatendu: j'ai juste un t qui s'affiche en résultat, c'est quoi le soucis ?
var_dump($_GET['sous_categorie']);



// Array des Catégories
	$aCategorie = array(1 => 'arts et culture', 2 => 'commerce et cociété', 3 => 'economie et ginance', 4 => 'enseignement et formation', 5 => 'gastronomie et alimentation', 6 => 'immobilier', 7 => 'informatique et internet', 8 => 'maison', 9 => 'news et média', 10 => 'ee-commerce', 11 => 'santé et beauté', 12 => 'voyages et tourisme', 13 => 'sport');
	
	// Array des Sous Catégories
	$aSous_Categorie = array(
	1 => array(1 => 'Architecture', 2 => 'Bande dessinée', 3 => 'Cinéma', 4 => 'Danse', 5 => 'Festival', 6 => 'Galerie', 7 => 'Litterature' ,8 => 'Musées' ,9 => 'Musique' ,10 => 'Peintres', 11 => 'Sculpture', 12 => 'Théâtre'),
	2 => array(1 => 'Agriculture et Pêche', 2 => 'Artisanat', 3 => 'Auto et Moto', 4 => 'Industrie', 5 => 'Juridique', 6 => 'Mode et Beauté', 7 => 'Services'),
	3 => array(1 => 'Assurance', 2 => 'Bourse', 3 => 'Crédit', 4 => 'Enchère', 5 => 'Finance'),
	4 => array(1 => 'Association et Organisme', 2 => 'Cours', 3 => 'Ecole', 4 => 'Formation', 5 => 'Université', 6 => 'E-learning'),
	5 => array(1 => 'Alimentation', 2 => 'Bio', 3 => 'Régime et Diététique', 4 => 'Restaurant', 5 => 'Vin et Alcools'),
	6 => array(1 => 'Immobilier luxe', 2 => 'Immobilier neuf', 3 => 'Location Appartement', 4 => 'Location Bureau', 5 => 'Location vacances'),
	7 => array(1 => 'Création site Internet', 2 => 'Hébergement', 3 => 'Logiciel', 4 => 'referencement ', 5 => 'Téléchargement', 6 => 'Jeux'),
	8 => array(1 => 'Bricolage', 2 => 'Jardin', 3 => 'Recette', 4 => 'Mobilier', 5 => 'Piscine'),
	9 => array(1 => 'Magazines', 2 => 'Life Style', 3 => 'Web radio', 4 => 'Journalisme'),
	10 => array(1 => 'Smartphone', 2 => 'Ordinateur', 3 => 'Maison', 4 => 'High tech', 5 => 'Décoration'),
	11 => array(1 => 'Médecine', 2 => 'Famille', 3 => 'Blog', 4 => 'Mode', 5 => 'Etablissement'),
	12 => array(1 => 'Gîte', 2 => 'Hôtel', 3 => 'Camping', 4 => 'Location de vacances', 5 => 'Location de luxe',  6 => 'Location de Bateaux',  7 => 'Location de maison'),
	13 => array(1 => 'athletisme', 2 => 'Auto moto', 3 => 'Bateau et voile', 4 => 'Chasse et Pêche', 5 => 'Fitness', 6 => 'Football', 7 => 'Golf', 8 => 'Handisport', 9 => 'ESport', 10 => 'Montagne', 11 => 'Sports aériens', 12 => 'Sports collectifs', 13 => 'Sports de combat', 14 => 'Sports glace'),
	);

$search = 'athletisme'; //Exemple:  athletisme qui correspond à la valeur 13

foreach ($aSous_Categorie as $categoryKey => $elements)
  if (in_array($search, $elements))
    break;

echo $aCategorie[1][$categoryKey]."\n"; // Categorie principale
Je cherche donc dans l'exemple à récupérer 13

Re: Array multidimensionnel

Posté : 13 juin 2019, 10:36
par Saian
Plutôt r non ? c'est parce que $aCategorie[1] c'est 'arts et culture' et r est le 14ème caractère (index 13). ^^
$aCategorie[$categoryKey]
PS : ça sert à rien de mettre des index numériques en dur et franchement la structure de tableau que je te proposais dans mon premier message me semble bien plus appropriée.

De plus si tu as la catégorie dans l'URL pourquoi ne pas simplement la retourner dans $_GET via la réécriture d'URL ?
En fait si le problème c'est de récupérer la chaîne originale à partir de la chaîne slugifiée, tu devrais plutôt te servir du tableau des catégories pour créer un tableau indexé sur les slugs :
function slugify($string) { /*...*/ };
$categories = array('arts et culture', /*...*/);
$slugifiedCategories = array_map(function ($category) { return slugify($category); }, $categories);
$indexedCategories = array_combine($slugifiedCategories, $categories);
$category = $indexedCategories[$_GET['category_slug']];

De plus si tu as les catégories et leur slug en base de données dans une table category suffit de faire une requête :
SELECT name FROM category WHERE slug = :category_slug
table catgory
- id
- name
- slug

Re: Array multidimensionnel

Posté : 13 juin 2019, 13:12
par yoann38
J'aimerais comprendre ce qui cloche dans ce code pour comprendre l'array pour moi c'est nikel mais bon surement que non
// Array des Catégories
$aCategorie= array(
  1 => array(1 => 'arts et culture', 2 => 'commerce et cociété', 3 => 'economie et ginance', 4 => 'enseignement et formation', 5 => 'gastronomie et alimentation', 6 => 'immobilier', 7 => 'informatique et internet', 8 => 'maison', 9 => 'news et média', 10 => 'e-commerce', 11 => 'santé et beauté', 12 => 'voyages et tourisme', 13 => 'sport')
);

// Array des Sous Catégories
	$aSous_Categorie = array(
	1 => array(1 => 'Architecture', 2 => 'Bande dessinée', 3 => 'Cinéma', 4 => 'Danse', 5 => 'Festival', 6 => 'Galerie', 7 => 'Litterature' ,8 => 'Musées' ,9 => 'Musique' ,10 => 'Peintres', 11 => 'Sculpture', 12 => 'Théâtre'),
	2 => array(1 => 'Agriculture et Pêche', 2 => 'Artisanat', 3 => 'Auto et Moto', 4 => 'Industrie', 5 => 'Juridique', 6 => 'Mode et Beauté', 7 => 'Services'),
	3 => array(1 => 'Assurance', 2 => 'Bourse', 3 => 'Crédit', 4 => 'Enchère', 5 => 'Finance'),
	4 => array(1 => 'Association et Organisme', 2 => 'Cours', 3 => 'Ecole', 4 => 'Formation', 5 => 'Université', 6 => 'E-learning'),
	5 => array(1 => 'Alimentation', 2 => 'Bio', 3 => 'Régime et Diététique', 4 => 'Restaurant', 5 => 'Vin et Alcools'),
	6 => array(1 => 'Immobilier luxe', 2 => 'Immobilier neuf', 3 => 'Location Appartement', 4 => 'Location Bureau', 5 => 'Location vacances'),
	7 => array(1 => 'Création site Internet', 2 => 'Hébergement', 3 => 'Logiciel', 4 => 'referencement', 5 => 'Téléchargement', 6 => 'Jeux'),
	8 => array(1 => 'Bricolage', 2 => 'Jardin', 3 => 'Recette', 4 => 'Mobilier', 5 => 'Piscine'),
	9 => array(1 => 'Magazines', 2 => 'Life Style', 3 => 'Web radio', 4 => 'Journalisme'),
	10 => array(1 => 'Smartphone', 2 => 'Ordinateur', 3 => 'Maison', 4 => 'High tech', 5 => 'Décoration'),
	11 => array(1 => 'Médecine', 2 => 'Famille', 3 => 'Blog', 4 => 'Mode', 5 => 'Etablissement'),
	12 => array(1 => 'Gîte', 2 => 'Hôtel', 3 => 'Camping', 4 => 'Location de vacances', 5 => 'Location de luxe',  6 => 'Location de Bateaux',  7 => 'Location de maison'),
	13 => array(1 => 'athletisme', 2 => 'Auto moto', 3 => 'Bateau et voile', 4 => 'Chasse et Pêche', 5 => 'Fitness', 6 => 'Football', 7 => 'Golf', 8 => 'Handisport', 9 => 'ESport', 10 => 'Montagne', 11 => 'Sports aériens', 12 => 'Sports collectifs', 13 => 'Sports de combat', 14 => 'Sports glace'),
	);

// Categorie principale
$search = $_GET['sous_categorie']; // referencement
$found = false;
foreach ($aSous_Categorie as $categoryKey => $elements) 
  if ($found = in_array($search, $elements))
    break ;

echo $found ? $aCategorie[1][$categoryKey]."\n" : "$search inexistant!\n"; // informatique et internet


foreach($aCategorie as $value) // Je devrais trouvé 7 normalement
{
  $key = key($aCategorie);
  echo $key;
}

Re: Array multidimensionnel

Posté : 13 juin 2019, 13:28
par Saian
Si tu fais
$search = 'referencement';
tu as déjà 7 dans $categoryKey, la dernière boucle est inutile. Encore une fois ton $_GET n'est pas bon.

Et cette dernière boucle... tu boucles sur $aCategorie qui n'a qu'un index, ça ne passe donc qu'une fois dedans et $value est le tableau de cet unique index. Tu fais un key qui dans tous les cas te retournera 1 car key est à utiliser en conjonction avec current et next. Bref ça n'a aucun sens. :P

J'ai même testé avec un foreach, on sait jamais, mais non ça ne fait pas bouger le pointeur retourné par key.
$array = $aCategorie[1];
foreach ($array as $value) {
  echo key($array);
}
// 1111111111111
while($value = current($array))
{
  echo key($array);
  next($array);
}
// 12345678910111213

Si tu fais un foreach sur un tableau et que tu veux la clé tu fais un
foreach ($array as $key => $value)
.