Array multidimensionnel

Mammouth du PHP | 643 Messages

25 mai 2019, 14:20

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

25 mai 2019, 14:26

Pratique est stocké dans $aCategorie[1][2] après quel lien tu fais avec la trottinette j'ai pas compris
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 1967 Messages

25 mai 2019, 14:34

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]
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Avatar du membre
Mammouth du PHP | 1609 Messages

25 mai 2019, 15:10

+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];
Développeur web depuis + de 20 ans

Mammouth du PHP | 643 Messages

25 mai 2019, 17:05

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;
}

Avatar du membre
Mammouth du PHP | 1609 Messages

25 mai 2019, 17:22

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
Développeur web depuis + de 20 ans

Mammouth du PHP | 643 Messages

26 mai 2019, 06:30

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 -

Avatar du membre
Mammouth du PHP | 1609 Messages

26 mai 2019, 10:49

Ç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)
Développeur web depuis + de 20 ans

Mammouth du PHP | 643 Messages

13 juin 2019, 10:08

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

Avatar du membre
Mammouth du PHP | 1609 Messages

13 juin 2019, 10:36

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
Modifié en dernier par Saian le 13 juin 2019, 16:29, modifié 1 fois.
Développeur web depuis + de 20 ans

Mammouth du PHP | 643 Messages

13 juin 2019, 13:12

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;
}

Avatar du membre
Mammouth du PHP | 1609 Messages

13 juin 2019, 13:28

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)
.
Développeur web depuis + de 20 ans