У меня многомерный массив:
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 )