Въпрос относно PHP код

tyrla4eto

Registered
Здравейте,
Имам един въпрос и той е как точно работи PHP кода отдолу?

PHP:
if($userProfile['extras']%2==0)

Малко обяснение за какво става въпрос.
Имам 3 екстри, които потребител може да активира, всяка екстра има номер (2 , 3 , 5). Скрипта, който е в момента (не съм го писал аз) е направен по следния начин.
Полето "extras" в базата по подразбиране е 1, с активиране на екстра това поле се умножава по екстрата със съответния статус.
(т.е ако активирам първо екстра със статус 2 полето от 1 става 2, след което ако активирам екстра със статус 5 полето 2 става 10 и накрая активирам екстра със статус 3 полето от 10 става 30)

Предполагам, че смисъла на този код, който писах по-горе е да проверява реално коя екстра от 3-те е активиране. НО не разбирам каква точно е логиката тук, защото винаги ми връща 1, а не 0, без значение коя или колко от екстрите са активирани.
 
Този метод за недвусмислено определяне на активирани екстри използва взаимно прости числа, за да може еднозначно чрез проверка дали стойността в базата се дели точно на 2, 3 или 5 да се определи коя екстра е активирана.

Това означава, че трябва да провериш числото дали се дели точно на всяка от възможните екстри.

Примерно, ако в БД стои 6:
6 % 2 = 0 => двойката e активирана
6 % 3 = 0 => тройката също
6 % 5 = 1 => не

Общо възможните комбинации са 2^3 = 8, т.е. 8 възможни случая (3 екстри, всяка е или активирана, или не: 2 * 2 * 2).

За да провериш дали екстра 2, 3 или 5 е активирана, проверяваш остатъка при деление на съответното число.

Кодът, който си дал, проверява за екстра 2.
 
Не мисля, че този код проверява коя или колко, а дали има. Ако 'extras' е 1, проверката няма да мине, но ако е 2, 10 или 30 - ще мине. Този код ще заработи само ако си активирал първата екстра, понеже ако тя не е активна, числото винаги ще е нечетно.
 
Ясно, но интересното е, че без значение какво число е в базата, резултата който ми вади винаги е 1. Някаква идея защо?Не знам дали реално вади резултата, като TRUE / FALSe или го вади като реален резултат от деление.
 
tyrla4eto каза:
Ясно, но интересното е, че без значение какво число е в базата, резултата който ми вади винаги е 1. Някаква идея защо?Не знам дали реално вади резултата, като TRUE / FALSe или го вади като реален резултат от деление.
Явно в базата всички числа са само четни/нечетни (кое е винаги 1? резултата от $value%2==0 или $value%2). Затова и резултатът е един и същ.

Замести горе в променливата с примерно 5 и проверката няма да мине.

Но защо в БД имаш само четни или само нечетни числа - това вече е друга тема и касае стойностите, които си въвел вътре, а не кода, който показваш.
 
anonimen каза:
tyrla4eto каза:
Ясно, но интересното е, че без значение какво число е в базата, резултата който ми вади винаги е 1. Някаква идея защо?Не знам дали реално вади резултата, като TRUE / FALSe или го вади като реален резултат от деление.
Явно в базата всички числа са само четни/нечетни (кое е винаги 1? резултата от $value%2==0 или $value%2). Затова и резултатът е един и същ.

Замести горе в променливата с примерно 5 и проверката няма да мине.

Но защо в БД имаш само четни или само нечетни числа - това вече е друга тема и касае стойностите, които си въвел вътре, а не кода, който показваш.

Когато активираш дадена екстра, статуса й се умножава по сегашното число в базата.

Примерно в базата имаш 1 (което е по-подразбиране, когато нямаш активирани екстри)
активираш екстра 2 в базата се записва 1 * 2, т.е 2
след това активираш екстра 5, в базата се записва 2 * 5, т.е 10

Ако активирам само 5 ще е 5* 1, т.е 10 и т.н.


А резултата го извадих така:
echo $value%2;

Но дали %2 или %3 или %5 винаги ми връща резултат 1, заради това скрипта не работи.
 
А резултата го извадих така:
echo $value%2;

Но дали %2 или %3 или %5 винаги ми връща резултат 1, заради това скрипта не работи.

Не е скриптът това, което не работи. Стойностите, които идват от базата са повредени/не каквито очакваш. Когато printваш %2/%3/%5 дай echo на чистата променлива, без %2/%3/%5, и виж нейната стойност. След това наум пресметни очаквания изход, за да се увериш, че скриптът си работи.

По-скоро виж как идват числата от БД и дали там наистина са записани разнообразни числа, както очакваш.
 
Е, как 5 * 1 ще стане 10?

3 * 1 = 3
5 * 1 = 5

Нито един от двата резултата не е четно число. Както вече ти казах, кодът ще работи единствено ако е активирана първата екстра, защото:

2 * 1 = 2 // Екстра 1

2 * 3 = 6 // Екстри 1 и 2

2 * 5 = 10 // Екстри 1 и 3

6 * 5 = 30 // Екстри 1, 2 и 3
 
В случая, кода проверява следното:
Ако(протребителският профил[екстри] е четно число ) {Извърши това}
Най-просто казано в момента проверяваш дали чистлото в базата ти е четно или не. Ако се дели постоянно на 2 и нямаш остатък, тоест е = 0 то тогава е четно, но ако имаш остатък то тогава е нечетно. Естествено при поставеното от теб условие е такова обяснението. Както ти казаха по-нагоре, ако смениш 2 с 3 но запазиш условието ще е друго обяснението и така нататък. Това се води деление с остатък:

http://php.net/manual/bg/language.operators.arithmetic.php

http://sbornik.biz/5class/Urok_22.php
 

Горе