PHP: как сделать эту функцию более эффективной? resourceToOneDimensionalArray (ресурс в одномерный массив)

Я хотел функцию, которая принимает mysqli_resource (как возвращено из mysqli_query) и определенный столбец и возвращает его как линейный массив PHP. Это то, что у меня есть сейчас:

function resourceToOneDimensionalArray($resource, $field) {
  if($resource == false) return false;
  if(is_array($resource)) {
    if(is_array($resource[0])) {
        $output = array();
        foreach($resource as $row) {
            array_push($output, $row[$field]);
        }
        return $output;
    }
    else {
        return $resource; // already a 1D array, return it
    }
  }
  $array = array();
  while($row = mysqli_fetch_array($resource)) {
    array_push($array, $row[$field]);
  }

  return $array;
}

Я думал, что слышал о функции PHP, которая делает это, но я не могу найти ее в документах. Не уверен, что я просто не могу найти, неправильно понять сами документы или придумал встроенную функцию.

Если эта функция так же хороша, как она получает, так и быть! Просто пытаюсь ускорить код.

1 ответ

  1. Небольшое улучшение производительности без влияния на потребление памяти может быть достигнуто за счет увеличения индекса, так array_pushкак это медленнее, чем прямой доступ к элементам массива (по крайней мере, в предыдущих версиях PHP профилирование еще не выполнялось в PHP7).

    $array = array();
    $idx = 0
    while($row = mysqli_fetch_array($resource)) {
      $array[$idx++] = $row[$field]);
    }
    

    Вы также можете профилировать, если есть существенная разница

    $array = array();
    while($row = mysqli_fetch_array($resource)) {
      $array[] = $row[$field]);
    }
    

    Если вы не заботитесь о потреблении памяти, вы можете получить полную таблицу mysqli_fetch_allодин раз и повторять массив строк, выбирая одно поле из него.

    Как правило, вы можете повысить производительность в PHP (и многих других языках), избегая вызовов функций, особенно в циклах, поскольку неоптимизированная компиляция означает, что регистры ЦП помещаются в стек и возвращаются после выполнения подпрограммы.

    Нет собственного способа mysqliполучить один столбец из уже выполненного запроса.