За последние 24 часа нас посетили 18462 программиста и 1607 роботов. Сейчас ищут 868 программистов ...

Одномерный массив из многомерного.

Тема в разделе "PHP для новичков", создана пользователем IceCream, 25 окт 2012.

  1. IceCream

    IceCream Активный пользователь

    С нами с:
    1 июл 2011
    Сообщения:
    27
    Симпатии:
    0
    Собственно сабж.
    В базе хранитсякуча товаров. Нас интересует только их ID.
    Нужно выбрать эти ID и сформировать из них одномерный массив дабы упростить дальнейшую задачу сравнение нескольких таких массивов и ещё нескоько подобного рода задачь.
    Собственно в голову сразу приходит простейший вариант. Тобиш получаем многомерный массив содержащий овер 9000 этих ID и после обходим его в цикле присваивая значениям нового массива значения вложенного массива с ключом "id".
    Код (Text):
    1.  
    2. $query = mysql_query("SELECT `id` FROM `products`");
    3. $prod_id = array();
    4. while ($array = mysql_fetch_array($query)) $prod_id[] = $array['id'];
    Вроде бы всё работает, но както медленно... Может есть встроенная функция для этих целей?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    медленно это как?

    $prod_id[$array['id']] = $array['id'];
    ТруЪ
     
  3. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    следующий вопрос "а почему она у меня не работает"
     
  5. IceCream

    IceCream Активный пользователь

    С нами с:
    1 июл 2011
    Сообщения:
    27
    Симпатии:
    0
    Ну это медленно. Причина конечно в первую голову в большом количестве данных, но обычно встроенные функции отрабатывают быстрее чем всевозможные цыклы с вызовом самопальных пункций, проверками и прочим. Вот подумал может и на такой случай что-то родное есть...
    Не везде оно тру. В моём случае даже совсем не тру. Это делается для разбора всевозможных прайсов на предмет обновления/добавления/удаления товаров из базы. Соответственно если выборка содержит два идентичных ID(а такое может быть по ряду причин) это также надо отследить, выяснить почему так и в соответствии с причиной должным образом обработать.
    И если мы делаем $prod_id[] = $array['id']; то полученный массив будет содержать весь перечень значений полученных из исходного многомерного массива. А если $prod_id[$array['id']] = $array['id']; то все не уникальные значения будут затираться при совпадении и мы увидим только последнее...

    Добавлено спустя 17 минут 33 секунды:
    Спасибо, так действительно можно сократить получаемый многомерный массив почти в два раза. Но разбирать его на одномерный всёравно придётся в цикле...
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    во-первых если вы выбираете только ID то какая разница
    во-вторых, что тогда содержится в этом поле? и в чем состоит смысл выборки? вы показали только часть запроса? покажите или расскажите логику кода. может вы там в цикле запросы потом фигачите

    Добавлено спустя 1 минуту 45 секунд:
    эм. вобще-то эта штука ничего не сокращает... вобще ничего не должно измениться. только упростится код и ускорится.

    Добавлено спустя 2 минуты 7 секунд:
    странная у вас логика.
    если хотите считать количество тогда ТруЪ:
    $prod_id[$array['id']]++;

    Добавлено спустя 57 секунд:
    в качестве инфо: выборка ключей массива делается array_keys() функцией. можно всегда получить и то и другое.
     
  7. IceCream

    IceCream Активный пользователь

    С нами с:
    1 июл 2011
    Сообщения:
    27
    Симпатии:
    0
    Собственно одна из задач тупо выгрузить ID товаров из рабочего каталога и новые ID товаров из выгруженного в базу прайса в массивы. После посредством двух функций вычислить что исчезло и что появилось в новом и соответственно либо скрыть удалённые в каталоге либо добавить появившиеся. Потом записать над какими товарами и что было сделано в лог, ну и многое другое...
    Но, так как прайс формирует хрен знает кто и как бывают дубли товаров. Например обновили что-то а старую строку не удалили.
    Поэтому выгружая все ID в массив я могу получить из него повторяющиеся значения и дальше уже вынести из их обработке записав в лог(выведя на экран, отправив мне по почте) либо посмотреть какая из записей отличается от записи в каталоге и использовать при обновлении её.

    Ну какбы в одном случае получаем массив вида:
    Код (Text):
    1. Array (
    2. [0] => Array ( [0] => 789651 [id] => 789651  )
    3. [1] => Array ( [0] => 789652 [id] => 789652  )
    4. [2] => Array ( [0] => 789653 [id] => 789653  )
    5. )
    в другом вида:
    Код (Text):
    1. Array (
    2. [0] => Array ( [id] => 789651  )
    3. [1] => Array ( [id] => 789652  )
    4. [2] => Array ( [id] => 789653  )
    5. )
    это сокращение или я что-то не так понимаю?

    А что не так то в ней? Из массива вида:
    Код (Text):
    1. Array (
    2. [0] => Array ( [id] => 789651  )
    3. [1] => Array ( [id] => 789652  )
    4. [2] => Array ( [id] => 789652  )
    5. )
    одном случае получаем массив
    Код (Text):
    1. Array (
    2. [0] =>  789651,
    3. [1] =>  789652,
    4. [2] => 789652  
    5. )
    с реальным списком IDшников, то есть то, что там 789652 дублируется два раза и надо проверить почему, а в другом
    Код (Text):
    1. Array (
    2. [0] =>  789651,
    3. [1] =>  789652
    4. )
    И надо проверять совпадение уже не просто выбрав их в массиве а отдельным запросом...
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это распространённые грабли. не знаю зачем вобще есть эта функция в пхп, но mysql_fetch_array может возвращать как номерки столбиков в ответе, так и их названия. За каким-то хреном она по дефолту возвращает оба варианта сразу. Поэтому у вас массив "двоится". Я всегда пользуюсь функцией mysql_fetch_assoc (в её mysqli варианте) поэтому не понял, что изменится =) простите.

    $prod_id[$array['id']]++; при такой схеме вам не придётся заново считать айдишники.
    Если конечно вам не нужны номерки строк.

    короче да, парсинг кривозабитых экселек это беда...