Транспонировать - это поменять местами столбцы и колонки массива, то есть повернуть его. Здесь вам никакого транспонирования не нужно.
bpp - bits per pixel, количество битов, отведённых под один пиксел изображения. Находится в поле BITMAPINFOHEADER.biBitCount.
Палитра находится сразу после BITMAPINFOHEADER?
Да. Но палитры, в общем случае, может и не быть, надо смотреть поле BITMAPINFOHEADER.biBitCount
То есть fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
Нет, в этом месте начинается данные о пикселах изображения. Палитра начинается по смещению BITMAPINFOHEADER.biSize + sizeof(BITMAPFILEHEADER).
Можно, но придётся отдельный счётчик делать и после нужного блока прерывать each, так что разницы никакой.
Ещё можно заранее отделить нужную часть массива через splice().
Алекс: Ну, приводить к строке не обязательно, даже код не поменяется. Единственное, о чём я не подумал сразу - если предварительно отсортировать массив по start, то всё выполнится за один проход.
Евгений: А это зависит от того, в каком формате сохраняется новость. Если там BBCode, то регуляркой, если готовый HTML, то каким-нибудь DOM-инструментом (XPath, Simple HTML DOM Parser, ...)
Хуршед Абдужалил: Во втором запросе у вас тоже излишество, его можно заменить на SELECT (DISTINCT `product`.`id`), оставив только внутренний SELECT и убрав GROUP BY и ORDER BY.
sunnyrio: Судя по ошибке, PHP тут не при чём. XMLHttpRequest - это запрос из JS. Ошибка, скорее всего, в неправильно установленном заголовке Content-Type.