Использование фигурных скобок в многомерном массиве - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть массив идентификаторов, используемых для выполнения запросов mysqli в цикле foreach (приведенный ниже код является лишь примером - массив будет содержать более 50+ элементов / идентификаторов). Для каждого элемента / идентификатора массива я запрашиваю массив, который затем включаю в массив compData. Однако я не уверен, как динамически определять массивы в цикле foreach. Я был бы очень признателен, если бы вы могли проверить, правильно ли я использую $ {$ val} в приведенном ниже коде или что-то не так. Спасибо.

  $idArray  = array(
    "List1",
    "List2",
  );

  $compData = array();
  foreach($idArray as $val) {
    $sth = mysqli_query($conn, "SELECT * FROM {$tableName} WHERE ID = {$val}");
    ${$val} = array();
    while($r = mysqli_fetch_array($sth)) {
      For ($n = 1; $n <= $CI_NOYEARS; $n++){
        ${$val}['data'][] = $r[$n]; 
      }
    }
    $compData[{$val}] = ${$val}
  }

  foreach($compData['List1'] as $result) {
    For ($n = 0; $n <= $CI_NOYEARS; $n++){
      echo $result[$n];
    }
  }

Приведенный выше код не работает и не отображает никаких данных из массива $ compData. Ниже приведен пример, который прекрасно работает, когда я выполняю код с использованием идентификаторов напрямую.

  $sth = mysqli_query($conn, "SELECT * FROM {$tableName} WHERE ID = 'List1'");
  $List1 = array();
  while($r = mysqli_fetch_array($sth)) {
    For ($n = 1; $n <= $CI_NOYEARS; $n++){
        $List1['data'][] = $r[$n];
    }
  }

  $companyData = array();
  $companyData['List1'] = $List1;

  foreach($compData['List1'] as $result) {
    For ($n = 0; $n <= $CI_NOYEARS; $n++){
      echo $result[$n];
    }
  }

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Сложно понять, какая ваша цель основана на коде, который вы предоставили, но это кажется намного сложнее, чем нужно.Я думаю, что то, что у меня есть, будет повторять ваш желаемый результат.

Вы также должны использовать подготовленные заявления;они более безопасны и значительно снижают нагрузку на запросы к базе данных, когда вы собираетесь повторять один и тот же запрос несколько раз.Я реализовал их здесь.

$idArray = ["List1", "List2"];
$sth     = $conn->prepare("SELECT * FROM `$tableName` WHERE ID = ?");

foreach($idArray as $val) {
    $data = [];
    $sth->bind_param("s", $val);
    $sth->execute();
    $result = $sth->get_result();
    while ($r = $result->fetch_array()) {
        $data = array_merge($data, array_splice($r, 1, $CI_NOYEARS));
    }
    $compData[$val]["data"] = $data;
}

foreach($compData["List1"]["data"] as $result) {
    echo $result;
}
0 голосов
/ 15 ноября 2018

Я не понимаю, почему вы вообще используете эту фигурную скобку, когда просто копируете ее в многомерный массив compData?Почему бы просто не поместить данные непосредственно в массив:

for ($n = 1; $n <= $CI_NOYEARS; $n++) {
    $compdata[$val]['data'][] = $r[$n];
}

(Вам также необходимо объявить их как массив на верхнем уровне foreach, конечно.)

Примечание: я бы посоветовал не интерполировать данные непосредственно в строку запроса, а вместо этого использовать связанные параметры: http://php.net/manual/en/mysqli-stmt.bind-param.php Это гораздо более безопасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...