Cuando tenemos que añadir elementos a un array en PHP, al igual que en otros lenguajes, hay muchas formas de hacerlo. En mi caso utilizaba el acceso directamente por índice, que para bucles triviales era muy conveniente (opción 2); o bien array_push, muy efectivo si nos queríamos ahorrar el índice, o si era necesario agregar más de un elemento a la vez.

Sin embargo, resulta sorprendente que no conociera la construcción $array[] =, que automáticamente mete elementos al final del arreglo, y que se encuentra incluso documentada como mejor candidato a array_push al agregar solamente un elemento. Esta forma no es solamente más sencilla y breve, sino también algo más eficiente como veremos a continuación.

Tras casi tres años de Rendimiento de variables dentro de cadenas en PHP, nada más sencillo que comprobar los efectos de cada una de las formas. Las pruebas de eficiencia se han ejecutado con PHP 5.4.9 sobre Kubuntu 13.04.

Opción 1: $arData[] = $iCont2
La opción recomendada, y que desconocía, añade en este caso un valor numérico al siguiente índice del array.

Opción 2: $arData[$iCont2] = $iCont2
La versión tradicional de especificar el índice sobre el que queremos añadir el elemento.

Opción 3: $arData[count($arData)] = $iCont2
Especificar el primer índice disponible, para agregarlo al final.

Opción 4: array_push($arData, $iCont2)
Usar la función array_push.

Los resultados obtenidos han sido:

Forma Tiempo (s)
$arData[] = $iCont2 6.4526679515839
$arData[$iCont2] = $iCont2 6.5631868839264
$arData[count($arData)] = $iCont2 12.127758979797
array_push($arData, $iCont2) 12.594254016876
<?php
  error_reporting(E_ALL);
  set_time_limit(0);
  $fStart = microtime(true);
  for ($iCont1 = 0; $iCont1 < 1000; $iCont1++)
  {
    $arData = Array();
    for ($iCont2 = 0; $iCont2 < 10000; $iCont2++)
    {
      $arData[] = $iCont2;
    }
  }
  $fStop = microtime(true);
  echo '$arData[] = $iCont2: ' . ($fStop - $fStart) . '<br/>';
 
 
  $fStart = microtime(true);
  for ($iCont1 = 0; $iCont1 < 1000; $iCont1++)
  {
    $arData = Array();
    for ($iCont2 = 0; $iCont2 < 10000; $iCont2++)
    {
      $arData[$iCont2] = $iCont2;
    }
  }
  $fStop = microtime(true);
  echo '$arData[$iCont2] = $iCont2: ' . ($fStop - $fStart) . '<br/>';
 
 
  $fStart = microtime(true);
  for ($iCont1 = 0; $iCont1 < 1000; $iCont1++)
  {
    $arData = Array();
    for ($iCont2 = 0; $iCont2 < 10000; $iCont2++)
    {
      $arData[count($arData)] = $iCont2;
    }
  }
  $fStop = microtime(true);
  echo '$arData[count($arData)] = $iCont2: ' . ($fStop - $fStart) . '<br/>';
 
 
  $fStart = microtime(true);
  for ($iCont1 = 0; $iCont1 < 1000; $iCont1++)
  {
    $arData = Array();
    for ($iCont2 = 0; $iCont2 < 10000; $iCont2++)
    {
      array_push($arData, $iCont2);
    }
  }
  $fStop = microtime(true);
  echo 'array_push($arData, $iCont2): ' . ($fStop - $fStart) . '<br/>';
?>

Apreciamos dos tendencias claras. Las dos primeras opciones, son aproximadamente el doble de veloces, no acarrean la sobrecarga ni de contar cuantos elementos tiene el array, ni de ejecutar una función.

Entre las dos primeras, las diferencias de rendimiento son menores de las que podría pensarse a priori, si bien la primera es tremendamente más simple.