Собственно сабж. В базе хранитсякуча товаров. Нас интересует только их ID. Нужно выбрать эти ID и сформировать из них одномерный массив дабы упростить дальнейшую задачу сравнение нескольких таких массивов и ещё нескоько подобного рода задачь. Собственно в голову сразу приходит простейший вариант. Тобиш получаем многомерный массив содержащий овер 9000 этих ID и после обходим его в цикле присваивая значениям нового массива значения вложенного массива с ключом "id". Код (Text): $query = mysql_query("SELECT `id` FROM `products`"); $prod_id = array(); while ($array = mysql_fetch_array($query)) $prod_id[] = $array['id']; Вроде бы всё работает, но както медленно... Может есть встроенная функция для этих целей?
Ну это медленно. Причина конечно в первую голову в большом количестве данных, но обычно встроенные функции отрабатывают быстрее чем всевозможные цыклы с вызовом самопальных пункций, проверками и прочим. Вот подумал может и на такой случай что-то родное есть... Не везде оно тру. В моём случае даже совсем не тру. Это делается для разбора всевозможных прайсов на предмет обновления/добавления/удаления товаров из базы. Соответственно если выборка содержит два идентичных ID(а такое может быть по ряду причин) это также надо отследить, выяснить почему так и в соответствии с причиной должным образом обработать. И если мы делаем $prod_id[] = $array['id']; то полученный массив будет содержать весь перечень значений полученных из исходного многомерного массива. А если $prod_id[$array['id']] = $array['id']; то все не уникальные значения будут затираться при совпадении и мы увидим только последнее... Добавлено спустя 17 минут 33 секунды: Спасибо, так действительно можно сократить получаемый многомерный массив почти в два раза. Но разбирать его на одномерный всёравно придётся в цикле...
во-первых если вы выбираете только ID то какая разница во-вторых, что тогда содержится в этом поле? и в чем состоит смысл выборки? вы показали только часть запроса? покажите или расскажите логику кода. может вы там в цикле запросы потом фигачите Добавлено спустя 1 минуту 45 секунд: эм. вобще-то эта штука ничего не сокращает... вобще ничего не должно измениться. только упростится код и ускорится. Добавлено спустя 2 минуты 7 секунд: странная у вас логика. если хотите считать количество тогда ТруЪ: $prod_id[$array['id']]++; Добавлено спустя 57 секунд: в качестве инфо: выборка ключей массива делается array_keys() функцией. можно всегда получить и то и другое.
Собственно одна из задач тупо выгрузить ID товаров из рабочего каталога и новые ID товаров из выгруженного в базу прайса в массивы. После посредством двух функций вычислить что исчезло и что появилось в новом и соответственно либо скрыть удалённые в каталоге либо добавить появившиеся. Потом записать над какими товарами и что было сделано в лог, ну и многое другое... Но, так как прайс формирует хрен знает кто и как бывают дубли товаров. Например обновили что-то а старую строку не удалили. Поэтому выгружая все ID в массив я могу получить из него повторяющиеся значения и дальше уже вынести из их обработке записав в лог(выведя на экран, отправив мне по почте) либо посмотреть какая из записей отличается от записи в каталоге и использовать при обновлении её. Ну какбы в одном случае получаем массив вида: Код (Text): Array ( [0] => Array ( [0] => 789651 [id] => 789651 ) [1] => Array ( [0] => 789652 [id] => 789652 ) [2] => Array ( [0] => 789653 [id] => 789653 ) ) в другом вида: Код (Text): Array ( [0] => Array ( [id] => 789651 ) [1] => Array ( [id] => 789652 ) [2] => Array ( [id] => 789653 ) ) это сокращение или я что-то не так понимаю? А что не так то в ней? Из массива вида: Код (Text): Array ( [0] => Array ( [id] => 789651 ) [1] => Array ( [id] => 789652 ) [2] => Array ( [id] => 789652 ) ) одном случае получаем массив Код (Text): Array ( [0] => 789651, [1] => 789652, [2] => 789652 ) с реальным списком IDшников, то есть то, что там 789652 дублируется два раза и надо проверить почему, а в другом Код (Text): Array ( [0] => 789651, [1] => 789652 ) И надо проверять совпадение уже не просто выбрав их в массиве а отдельным запросом...
это распространённые грабли. не знаю зачем вобще есть эта функция в пхп, но mysql_fetch_array может возвращать как номерки столбиков в ответе, так и их названия. За каким-то хреном она по дефолту возвращает оба варианта сразу. Поэтому у вас массив "двоится". Я всегда пользуюсь функцией mysql_fetch_assoc (в её mysqli варианте) поэтому не понял, что изменится =) простите. $prod_id[$array['id']]++; при такой схеме вам не придётся заново считать айдишники. Если конечно вам не нужны номерки строк. короче да, парсинг кривозабитых экселек это беда...