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.

Другие вопросы по тегам