2014-09-17 1 views
1

J'ai un tableau multidimensionnel $games_array qui ressemble à ceci:Rechercher un tableau multidimensionnel et retourner la clé parent

<?php 

$games_array = array(
    "game-one" => array(
    "name" => "Game One", 
    "download_id" => "gameone", 
    "file" => "./games/files/Game One.zip" 
), 
    "game-two" => array(
    "name" => "Game Two", 
    "download_id" => "gametwo", 
    "file" => "./games/files/Game Two.zip" 
) 
); 

?> 

Par exemple, pour accéder au nom du premier jeu, j'utiliser $games_array["game-one"]["name"] qui fonctionne bien. Bon, maintenant au problème: J'ai une valeur, par exemple gameone, qui correspond à download_id (qui est une clé que tous les jeux dans $games_array a).

Maintenant, je veux trouver la clé, dans cet exemple game-one ou game-two, du tableau qui contient cette valeur pour la clé download_id. Ça marche. Ce que je fais dans le code ci-dessous est de parcourir $games_array et de rechercher chaque jeu pour la valeur (dans le code ci-dessous gameone). S'il est trouvé, la clé de cette valeur est renvoyée.

La prochaine chose que je fais (if ($key_found) { ...) est d'essayer de trouver la valeur de la file clé en utilisant le tableau dans lequel la valeur pour laquelle je cherchais à l'origine a été trouvé, et l'enregistrer dans $file.

Malheureusement $file est toujours vide et je ne sais pas pourquoi.

<?php 

$key = ""; 
$key_found = false; 
$search_for_value = "gameone"; // search for game's download id in array 
$file = ""; 

foreach($games_array as $game_id => $game_data) { 
    $key = array_search($search_for_value, $game_data); 
    echo "Searching for value <b>" . $search_for_value . "</b> in sub-array <b>" . $game_id . "</b>...<br />"; 
    if ($key === FALSE) { 
    echo "Search returned FALSE<br /><br />"; 
    } else if ($key === NULL) { 
    echo "Search returned NULL<br /><br />"; 
    } else { 
    echo "\$key <b>" . $key . "</b> found! <br /><br />"; 
    $key_found = true; 
    } 
    if ($key_found) { 
    // Key "download_id" found. Now search the parent array for the found key and use the 
    // returned result as the new key to access the "file" value in the found game's id in $games_array 
    $file = $games_array[array_search($key, $game_id)]["file"]; 
    echo "The key <b>" . $key . "</b> was found.<br/>"; 
    echo "\$file = " . $file . "<br />"; 
    echo "Exiting loop.<br /><br />"; 
    break; 
    } 
} 

$file = $games_array[$games_data]["file"]; 
echo "Checking if the file \"" . $file . "\" exists...<br />"; 
echo (file_exists($file) ? "File \"" . $file . "\" exists." : "File \"" . $file . "\" does not exist."); 

?> 

J'espère que vous comprenez mon problème et que vous pouvez m'aider. J'apprécierais beaucoup ... Je suis vraiment coincé ici.

Répondre

2

Si vous savez déjà que vous allez chercher dans download_id, vous rendez ce code beaucoup plus compliqué qu'il ne devrait l'être. Je ne suis pas sûr s'il y a une vraie réponse à votre question autre que d'essayer une approche complètement différente.

Au lieu d'utiliser tous ces appels array_search, vous pouvez vérifier directement la valeur de la colonne que vous savez que vous cherchez, comme ceci:

foreach($games_array as $game_id => $game_data) { 
    if($game_data["download_id"] == $search_for_value) { 
     $file = $game_data["file"]; 
     break; 
    } 
    } 
+0

Merci! Une approche bien meilleure qui fonctionne aussi parfaitement. –

Questions connexes