2015-08-23 3 views
0

У меня проблема с элементом in_array, который я использую в сценарии точки дартс.PHP in_array странное поведение

Краткое описание того, что пойдет не так. Я использую in_array для проверки повторного появления для того же игрока в одиночной игре дартс. если один игрок играет в несколько одиночных игр, только первый должен дать игроку очки для индивидуального рейтинга.

Как-то он делает это в обратном порядке (check linked image для справки (извините за неправильную краску):) желтый - текущий результат, зеленый - как это должно быть. средний 4 не считается, так как они двойные.

изображение: In array diagram http://149.210.139.155/~dfk/tmp/inarray/matchform_inarray_mess2.png

in_array вложен в цикле в то время, так что я не понимаю, где такое поведение происходит из.

код in_array:

//calculate indiv points 
//Player TeamA 
if(!in_array($scoresheet[$f_locA][$m_id], $IndivTeamA)){ 
$scoreA = $scoresheet[$f_locA][$m_po] . "-" . $scoresheet[$f_locB][$m_po]; 
$IndivTeamA[$scoresheet[$f_locA][$m_id]][rowid] = $scoresheet[$f_locA]  [$r_id]; 
$IndivTeamA[$scoresheet[$f_locA][$m_id]][points] =  GetIndivScore($scoreA,$BestOf); 
} 
//Player TeamB 
if(!in_array($scoresheet[$f_locB][$m_id], $IndivTeamB)){ 
$scoreB = $scoresheet[$f_locB][$m_po] . "-" . $scoresheet[$f_locA][$m_po]; 
$IndivTeamB[$scoresheet[$f_locB][$m_id]][rowid] = $scoresheet[$f_locB][$r_id]; 
$IndivTeamB[$scoresheet[$f_locB][$m_id]][points] = GetIndivScore($scoreB,$BestOf); 
} 

All relevant code

Если кто-то может пожалуйста, сообщите мне, что либо я сделал неправильно или почему это это поведение материала способ. Я не могу найти информацию об этом здесь или в Google. i allrady потерял 3 часа на этом.

Я бы не ожидал, что это будет возможно, поскольку цикл while генерирует каждую строку, начиная с строки 1, поэтому было бы невозможно (по моей логике по крайней мере), чтобы последняя строка была allready в массиве, когда php все еще нуждается в сгенерируйте его.

Заранее благодарим за ваши усилия, чтобы помочь мне и моим советам, если я совершу глупую ошибку.

EDIT: VAR_DUMP & добавлен идентификатор строки, чтобы изображение

+0

Вы хотите, чтобы 'in_array' возвращал только первое значение игры? Как и в случае, если член команды появляется более одного раза, вы ничего не сказали 'in_array' о том, какое значение сохранить. Было бы полезно получить 'var_dump' вашего массива, а также проверить, что ваш оператор' if' фактически отрицается с помощью '!', Поэтому в отношении вашего вопроса я думаю, что мы хотим видеть, это оператор 'else', который соответствует к 'Если вы заявили. – Martin

+0

Привет, Мартин, спасибо за ваш ответ. Я действительно хочу, чтобы только первая итерация игрового значения (points и row_id) сохранялась для каждого игрока. В операторах if нет никакого выражения. Ссылка «Весь соответствующий код» имеет код, вырезанный, где повторяются точки. Все остальные коды есть. Если пользователь не находится в массиве allready, он получает оценку для игрока TeamA & TeamB с этой ноги, отправляет его в funcion, который возвращает очки за этот счет. Поэтому, если пользователь уже находится в массиве, ничего не происходит. Вот почему я не понимаю, как последнее значение попадает в массив. –

ответ

0

Проблема теперь исправлена ​​и связана с тем, что я использовал in_array для многомерного массива, который не поддерживается.

Поскольку исходный оператор if не создал массив, о котором идет речь, я не смог бы его исправить, реализовав цикл foreach. Я просто добавил новый массив только с идентификаторами пользователя, чтобы исправить эту проблему.

Решение было предоставлено Sneezydevil от tweakers.net (где я также разместил это сообщение).

0

in_array ищет значение, вы используете ключ здесь. Вместо этого используйте array_key_exists.

Используемый in_array находит в массиве следующее значение .

in_array($scoresheet[$f_locA][$m_id], $PlayerIndivA) 

Однако присвоить значение

$scoresheet[$f_locA][$r_id]; 

Чувствуете разницу в m_id $ и $ R_ID.

+0

Простите, это неправда. Я ищу значение, а не ключ. Thx за попытку помочь. –

+0

См. Мои изменения, значения, которые вы назначаете, различны. – TJHeuvel

+0

Да, это так же конструировано. r_id - это строка_ид из базы данных, m_id - member_id. Так как m_id не является уникальным в форме (и db), но его нужно использовать для идентификации повторений, вместо этого сохраняется r_id, поэтому индивидуальная оценка сохраняется в правильной строке в базе данных. –

Смежные вопросы