Найти значения в многомерных массивах

У меня многомерный массив:

array ( array ( "username" => "foo", "favoriteGame" => "Mario" ) array ( "username" => "bar", "favoriteGame" => "Mario" ) array ( "username" => "xyz", "favoriteGame" => "Zelda" ) ) 

Как я могу получить имена пользователей, которые любят играть, например, Марио самым простым способом?

EDIT: Моя ошибка: забудьте явно указать, что значение «favoriteGame» является динамическим, и я не могу знать, что это заблаговременно.

Мое решение:

 foreach($users as $key => $value) { if(!isset($$value['favoriteGame'])) { $$value['favoriteGame'] = array(); } array_push($$value['favoriteGame'], $value['username']); } 

Перейдите по каждому подматрицу и найдите его значение favoriteGame. Если еще нет массива $ favoriteGame, создайте его. Нажмите имя пользователя-значение фактического подматрица в массив $ favoriteGame.

Спасибо за ваши ответы, я просто не мог правильно сформулировать этот вопрос.

Я бы использовал array_filter . Если у вас PHP 5.3 или выше, вы можете сделать это следующим образом:

 $favorite = "Mario"; $filter = function($player) use($favorite) { return $player['favoriteGame'] == $favorite; }; $filtered = array_filter($players, $filter); 

Это будет немного отличаться для старых версий, потому что вы не сможете использовать лямбда-функции.

 function getUsernamesByFavoriteGame($data, $game) { $usernames = array(); foreach($data as $arr) { if ($arr['favoriteGame'] == $game) { $usernames[] = $arr['username']; } } return $usernames; } 
  $usernames = array(); foreach($array as $key => $value) { if ($value['favoriteGame'] == 'Mario') { $usernames[] = $value['username']; } } 
  $game = 'Mario'; $users = array(); foreach($array as $key => $value) { if ($value['favoriteGame'] == $game) { $users[] = $value['username']; } } 

Если вы используете это чаще, то преобразуйте структуру данных в нечто подобное.

  array( "Mario" => array( "0":"foo", "1":"xyz" ) "Zelda" => array( "0":"pqr", "1":"abc" ) ) 

Это даст вам список имен пользователей для любимой игры.

 $arr[$favGame] 

Если вы не можете изменить структуру данных, тогда идите с помощью tigrang.

Я думаю, вы должны реализовать пользовательскую многомерную функцию поиска.
Взгляните на этот ответ .


Вот как вы его используете

Код | Живой пример

 function search($array, $key, $value){ $results = array(); if (is_array($array)) { if (isset($array[$key]) && $array[$key] == $value) $results[] = $array; foreach ($array as $subarray) $results = array_merge($results, search($subarray, $key, $value)); } return $results; } $arr = array ( array ( "username" => "foo", "favoriteGame" => "Mario" ), array ( "username" => "bar", "favoriteGame" => "Mario" ), array ( "username" => "xyz", "favoriteGame" => "Zelda" ) ); print_r(search($arr, 'favoriteGame', 'Mario')); //OUTPUT Array ( [0] => Array ( [username] => foo [favoriteGame] => Mario ) [1] => Array ( [username] => bar [favoriteGame] => Mario ) ) 
 $array = array( 'a' => 'A', 'b'=>'B', 'c'=>'C', 'd'=>array( 'e'=>array( 'f'=>'D' ), 'g'=>array( 'h'=>'E' ) ), 'i'=>'F', 'j'=>array( 'k'=>'G' ), 'l'=>'H' ); $new_array = array(); foreach($array as $k1=>$v1){ if(is_array($v1)){ $new_array = parseArray($new_array, $k1, $v1); }else{ $new_array = array_merge($new_array, array($k1=>$v1)); } } function parseArray($new_array, $key, $val){ if(is_array($val)){ foreach($val as $k2=>$v2){ if(is_array($v2)){ $new_array = parseArray($new_array, $k2, $v2); }else{ $new_array = array_merge($new_array, array($k2=>$v2)); } } }else{ $new_array = array_merge($new_array, array($key=>$val)); } return $new_array; } , $array = array( 'a' => 'A', 'b'=>'B', 'c'=>'C', 'd'=>array( 'e'=>array( 'f'=>'D' ), 'g'=>array( 'h'=>'E' ) ), 'i'=>'F', 'j'=>array( 'k'=>'G' ), 'l'=>'H' ); $new_array = array(); foreach($array as $k1=>$v1){ if(is_array($v1)){ $new_array = parseArray($new_array, $k1, $v1); }else{ $new_array = array_merge($new_array, array($k1=>$v1)); } } function parseArray($new_array, $key, $val){ if(is_array($val)){ foreach($val as $k2=>$v2){ if(is_array($v2)){ $new_array = parseArray($new_array, $k2, $v2); }else{ $new_array = array_merge($new_array, array($k2=>$v2)); } } }else{ $new_array = array_merge($new_array, array($key=>$val)); } return $new_array; } 

Вывод

 Array ( [a] => A [b] => B [c] => C [f] => D [h] => E [i] => F [k] => G [l] => H )