Я действительно понятия не имею, что происходит. История:
Я использую 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, моей первой мыслью было: утечка памяти — ясный случай!
Спасибо за вашу помощь.
Мех, у меня нет 50 репутации; не могу комментировать только ответ.
Если вы замените a на be в вашем цикле, вы должны получить ожидаемый результат (с учетом образца данных). т.е .:
foreach($res as $e){
$this->normTable[$e['b']][$e['points']]=$e['performance'];
$this->normTable[$e['b']]['compare']=$e['compare'];
}
Но я не уверен, что это действительно решит вашу проблему. YMMV.
Других решений пока нет …