powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP, вопрос по === со скалярами
20 сообщений из 20, страница 1 из 1
PHP, вопрос по === со скалярами
    #38923654
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у меня такой код:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
$var['total'] = array('cnt'=>0, 'sum'=>0);
$var['registry'] = array('cnt'=>0, 'sum'=>0);
...
foreach (...)
{
...
  $var['registry']['cnt']++;
  $var['registry']['sum'] += $payAmount;
...
}
if (...)
{
  $var['total'] = array('cnt'=>0+$tmp[0], 'sum'=>0+$tmp[1]);
}
print_r($var);
if (isset($var['total']['cnt']))
{
  if (($var['total']['cnt'] === $var['registry']['cnt']) && ($var['total']['sum'] === $var['registry']['sum']))
  {
    echo "Совпадают";
  }
  else
  {
    echo "Не совпадают";
  }
}



Этот код выдает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Array
(
    [total] => Array
        (
            [cnt] => 16
            [sum] => 8396
        )
    [registry] => Array
        (
            [cnt] => 16
            [sum] => 8396
        )
)
Не совпадают

Здесь написано, что === это тождественное равенство, сравниваемые выражения должны иметь одинаковые значения и тип.
И в этом случае я не понимаю, почему я получаю результат "Не совпадают".
sum является float, но и с таким кодом я получал аналогичный результат:
Код: php
1.
if (($var['total']['cnt'] === $var['registry']['cnt']) && (intval(100*$var['total']['sum']) === intval(100*$var['registry']['sum'])))


Или в данном случае лучше использовать == ?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38923683
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. print_r много чего не показывает. Используйте var_dump для более подробного вывода.
2. Сложные выражения можно разбить на две части с целью локализации места возникновения ошибки или непоняток. Типа такого:
Код: php
1.
var_dump(($var['total']['cnt'] === $var['registry']['cnt']) , ($var['total']['sum'] === $var['registry']['sum']));
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38923684
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle,
у меня true.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
$my=array(
	'total'=>array(
		'cnt'=>16,
		'sum'=>8396
		),
	'registry'=>array(
		'cnt'=>16,
		'sum'=>8396)	
	);

if (	($my['total']['cnt'] === $my['registry']['cnt']) && (intval(100*$my['total']['sum']) === intval(100*$my['registry']['sum']))){
echo "true";	
}else
 echo "false";


Но читаемость кода у вас ....
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38923841
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.И в этом случае я не понимаю, почему я получаю результат "Не совпадают".
ну очевидно несовпадают типы данных.
вывести дамп данных и будет всё видно сразу. неужели сам не можешь найти причину?
у нас то нет твоих данных, хз что там твой код с ними делает
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38923916
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uну очевидно несовпадают типы данных.
Приведенный код — полный.
То есть элементы $var['total'] и $var['registry'] более нигде не изменяются, только в приведенном фрагменте.
И я пока не вижу причину для того, чтобы типы данных не совпали.
Правда теперь, после этого замечания, я подумал что возможно в $var['registry']['sum'] находится float, а в $var['total']['sum'] хранится int (или наоборот).
Спасибо за подсказку, скорее всего дело в этом.
Посмотрю что var_dump напишет.
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38923922
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

$my['total']['cnt'] === $my['registry']['cnt']

здесь с таким же успехом может быть несовпадение типов
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38923939
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-k2-здесь с таким же успехом может быть несовпадение типов
Хм... А можно пояснить, каким образом?
registry инициализируется нулем и изменяется исключительно с помощью ++.
А total вычисляется как 0+$tmp[0], причем в $tmp[0] всегда бывает только строка из цифр (цифр немного, они гарантированно умещаются в int).
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38923946
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

$cnt = 0;
$cnt1 = 1.0;
var_dump($cnt+$cnt1); //float(1)

по приведенному коду неясен тип $tmp[0], поэтому var['total'] = array('cnt'=>0+$tmp[0] .. не гарантирует приведения типов к целому, как для $var['registry']['cnt']
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38923959
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-k2-Alibek B.,

$cnt = 0;
$cnt1 = 1.0;
var_dump($cnt+$cnt1); //float(1)

по приведенному коду неясен тип $tmp[0], поэтому var['total'] = array('cnt'=>0+$tmp[0] .. не гарантирует приведения типов к целому, как для $var['registry']['cnt']
0+$tmp[0] гарантирует получение числа..
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38923966
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kunaksergey,

но не гарантирует тип:
var_dump(0+"01");//int(1)
var_dump(0+"1.0");//float(1)
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38923996
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-k2-,
если он не знает даже тип, тогда
Код: php
1.
(int)(0+'1.0')
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38924002
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kunaksergey,

об чем и речь :)
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38924005
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-k2-var_dump(0+"1.0");//float(1)
Да, с sum у меня так и было; $tmp[1]="10.00", приводился к float, результат (0+$tmp[1]) получался float.
Но про cnt я писал, что это строка, состоящая только из цифр, десятичной точки там нет.

Как лучше проверять, явно приводить типы и сравнивать ===, или использовать ==?
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38924010
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,
что такое ==?.. я что-то не вкурсе
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38924012
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это вопросительный знак в конце предложения.
Я хотел спросить, как лучше сравнивать: явно приводить типы и использовать тождественное равенство или использовать сравнение == с неявным приведением типов?
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38924017
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.Это вопросительный знак в конце предложения.
Я хотел спросить, как лучше сравнивать: явно приводить типы и использовать тождественное равенство или использовать сравнение == с неявным приведением типов?
в зависимости от контекста.. Хотя в некоторой документации рекомендуют "===";
"==?" -я даже заново спецификацию перечитал :))
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38924019
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

если в
if (($my['total']['cnt'] === $my['registry']['cnt']) && (intval(100*$my['total']['sum']) === intval(100*$my['registry']['sum']))){
по приведенным данным второе условие выполняется гарантированно(и значения и типы), то логично предположить, что не выполняется первое, чудес то не бывает
и через var_dump вы уже наверняка поняли почему именно, только нам не говорите :)

авторКак лучше проверять, явно приводить типы и сравнивать ===, или использовать ==?
в данном случае смысла проверять соответствие типов не вижу, по приведенному коду достаточно соответствия значений
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38924401
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще непойму о чем разговор.
ТС, тебе же сказали выше, выведи через var_dump() то что ты сравниваешь, и сразу увидишь какие там типы в реальности, а не те что ты придумал у себя в уме.
а дальше уже ищи где именно в коде у тебя тип меняется.

если нужно гарантировать тип, приводи его вручную. (int), intval(), floatval()... всё.

блин. проблема на пустом месте. решается за 10 минут. а тут второй день уже происходит катание ваты.

это же основы отладки. если чтото работает не так - выведи дамп и посмотри что там в реальности
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38924665
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uблин. проблема на пустом месте. решается за 10 минут. а тут второй день уже происходит катание ваты.
Проблема за 10 минут и решилась, после проверки типов через var_dump.
Остальное время мне было интересно узнать, как вообще могло получится, что типы данных не совпали. Ну и как лучше сравнивать, чтобы даже при несовпадении типов сравнение было успешным.
...
Рейтинг: 0 / 0
PHP, вопрос по === со скалярами
    #38924676
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Остальное время мне было интересно узнать, как вообще могло получится, что типы данных не совпали.
точно также. var_dump в цикле.

Alibek B.Ну и как лучше сравнивать, чтобы даже при несовпадении типов сравнение было успешным.
если только по значению то ==
если еще с учетом типа ===
ты сам об этом написал еще в первом сообщении. все же очевидно
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP, вопрос по === со скалярами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]