Нахождение наибольшего значения 3 ключей в массиве с большим количеством ключей - PullRequest
0 голосов
/ 20 января 2019

У меня есть массив, который выглядит следующим образом:

Array
    (
        [id] => 12
        [team_home_id] => 50
        [team_away_id] => 63
        [score_team_home] => 1
        [score_team_away] => 1
        [league_id] => 3
        [home_win_pred] => 50
        [draw_pred] => 26
        [away_win_pred] => 24
    )

Теперь ת я хочу посмотреть с 3 клавиш (3 прогноза: home_win_pred, draw_pred, away_win_pred), который являетсясамый высокий, а затем вернуть этот ключ.

Я думал, что код, который я использовал, работает, но, похоже, он возвращает другой ключ, если где-то в массиве есть повторяющееся значение.Таким образом, в приведенном выше примере он возвращает team_home_id, поскольку это также 50, как самый высокий в моем 3.

код, который я использую:

array_search(max($arr[$x]['home_win_pred'], $arr[$x]['draw_pred'], $arr[$x]['away_win_pred']), $arr[$x]);

для приведенного выше массива примера, который он возвращает team_home_id вместо home_win_pred

Как я могу это исправить?

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Вот один из вариантов, который подходит к проблеме путем формального подстановки массива только к интересующим ключам. Затем он использует array_keys(), чтобы найти ключи, имеющие максимальное значение.

$keys = array('home_win_pred', 'draw_pred', 'away_win_pred');
$subset = array_intersect_key($arr, array_flip($keys));
$maxs = array_keys($subset, max($subset));

print_r($maxs);  // could be more than one key here

Array
(
    [0] => home_win_pred
)

Обратите внимание, что при этом будет возвращено несколько ключей трех ключей интереса, если найдется связь для наибольшего значения.

0 голосов
/ 20 января 2019

Почему вы получаете этот результат:

array_search - Выполняет поиск в массиве заданного значения и возвращает первый соответствующий ключ в случае успеха.

В вашем коде

max($arr[$x]['home_win_pred'], $arr[$x]['draw_pred'], $arr[$x]['away_win_pred'])

возвращает 50, а первое вхождение 50 - в ключе team_home_id.

0 голосов
/ 20 января 2019

Почему бы не использовать простой цикл for:

$arr = array("team_home_id" => 50, "home_win_pred" => 50, "draw_pred" => 26, "away_win_pred" => 24);

$fields = array('home_win_pred','draw_pred','away_win_pred'); //field you want to loop over
$k = array_shift($fields); //take the first field
$max = $arr[$k]; // set the first value as max
foreach($fields as $filed) {
    if ($arr[$filed] > $max) { // if found a new max updated max an field
        $max = $arr[$filed];
        $k = $filed;
    }
}

Сейчас, $k, если самое высокое поле: home_win_pred

...