PHP: неверное значение после присваивания
Я действительно понятия не имею, что происходит. История: я использую PDO для оператора SELECT в базе данных.
$sql = "SELECT a,b,c,performance,points,compare
FROM normvalues
WHERE x=:x AND y=1 AND z=:z";
$stmt = $GLOBALS['PDO']->prepare($sql);
$stmt->bindParam(":x",$x);
$stmt->bindParam(":z",$z);
$stmt->execute();
$res=$stmt->fetchAll(PDO::FETCH_ASSOC);
Так что это нормально, и это работает. Когда я var_dump $res
переменная я получаю что-то вроде:
array(6) {
["a"]=> string(2) "44"
["b"]=> string(4) "1176"
["c"]=> string(4) "1166"
["performance"]=> string(4) "50.1"
["points"]=> string(1) "1"
["compare"]=> string(2) "-1"
}
[1]=>
array(6) {
["a"]=> string(2) "57"
["b"]=> string(4) "1176"
["c"]=> string(4) "1166"
["performance"]=> string(4) "47.7"
["points"]=> string(1) "2"
["compare"]=> string(2) "-1"
}
[2]=>
array(6) {
["a"]=> string(2) "70"
["b"]=> string(4) "1176"
["c"]=> string(4) "1166"
["performance"]=> string(4) "44.7"
["points"]=> string(1) "3"
["compare"]=> string(2) "-1"
}
...
Это тоже хорошо. Но я должен отсортировать результат по-другому. Итак, я делаю:
foreach($res as $e){
$this->normTable[$e['a']][$e['points']]=$e['performance'];
$this->normTable[$e['a']]['compare']=$e['compare'];
}
И теперь я полностью потерялся. Назначая $e['performance']
Я получаю неправильные значения. На самом деле это должны быть значения производительности.
[1176]=>
array(4) {
[1]=> string(2) "50"
["compare"]=> string(2) "-1"
[2]=> string(2) "48"
[3]=> string(2) "45"
}
Я уже проверил значения в базе данных, и они верны. При выполнении doubleval()
Я бы получил правильные значения, но проблема в том, что не каждое значение является двойным, но также целым числом или строкой. Я также попытался типизировать с (строка), но это тот же результат. У меня нет объяснения.
Обновить:
Это очень большой проект, и я просто попытался свести его к минимуму и сделать свою проблему максимально понятной. Но теперь я понял кое-что новое: я делаю 'echo()' для моей первой переменной в normTable во время цикла:
foreach($res as $e){
$this->normTable[$e['a']][$e['points']]=$e['performance'];
echo "a:".$e['a']." pt: ".$e['points']." perf: ".$e['performance']."-".$this->normTable[1176][1]."\n";
$this->normTable[$e['a']]['compare']=$e['compare'];
}
и значение меняется с "50.1" на "50". Все еще не могу понять причину. Есть ли ограничение размера массивов в PHP?
ОБНОВЛЕНИЕ 2 и большой извините!
Как я уже сказал, это большой проект. Таким образом, таблица, которую я прочитал, имеет несколько значений для некоторых атрибутов дважды или более. На самом деле такого случая не должно быть. Вот почему ответ прост: стало 50, потому что 50 было назначено. Мне очень жаль, что я потратил ваше время. Но я полностью исключил этот случай, и поскольку я также пишу код на C, моей первой мыслью было: утечка памяти - ясный случай!
Спасибо за вашу помощь.
1 ответ
Мех, у меня нет 50 репутации; не могу комментировать только ответ.
Если вы замените a на be в вашем цикле, вы должны получить ожидаемый результат (с учетом образца данных). То есть:
foreach($res as $e){
$this->normTable[$e['b']][$e['points']]=$e['performance'];
$this->normTable[$e['b']]['compare']=$e['compare'];
}
Но я не уверен, что это действительно решит вашу проблему. YMMV.