Оптимизация циклов

Тема в разделе "Как сделать...", создана пользователем SocMaster, 29 сен 2014.

  1. SocMaster

    SocMaster aka Hakerok

    Регистр.:
    26 июл 2011
    Сообщения:
    202
    Симпатии:
    47
    Есть код в нем 4 цикла, пробовал по разному оптимизировать, но нифига. не получается
    Код:
        foreach ($picsDataArr as $r)
        {
            $actualtime = gmdate("d Y H:i",$r['dateline']);
            $picsArr[$actualtime][$r['uid']][] = $r;
        }
        $i = 0;
       
        foreach ($picsArr as $row)
        {
            foreach ($picsArr as $subRow)
            {
                $resultArr[$i]['dateLine'] =  rus_month($subRow[0]['dateline']);
                $resultArr[$i]['userFullName'] = $subRow[0]['realname'];
                $resultArr[$i]['homeref'] = 'uid'.$subRow[0]['uid'];
                foreach ($subRow as $r)
                    $resultArr[$i]['pic'][] = 'data/attachment/album/'.$r['filepath'];
            }
            $i++;
        }
    или тут нельзя юзать меньше циклов?
     
  2. Hannibal86

    Hannibal86 Создатель

    Регистр.:
    17 сен 2014
    Сообщения:
    37
    Симпатии:
    17
    А можно узнатькакие вводные данные и что надополучить? тут вижу что вы из одного цикла получаете массив данных, а потом опять этот массив разбираете.
     
  3. SocMaster

    SocMaster aka Hakerok

    Регистр.:
    26 июл 2011
    Сообщения:
    202
    Симпатии:
    47
    Код:
    array (
      '22 2014 11:35' =>
      array (
        1 =>
        array (
          0 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1411385713',
            'filepath' => '201409/22/143513f1t3n1q0yjlunr08.jpg',
          ),
          1 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1411385713',
            'filepath' => '201409/22/143513epwu7utiiwwaqji8.jpg',
          ),
          2 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1411385712',
            'filepath' => '201409/22/143512lpwnmi9y39vmi355.jpg',
          ),
          3 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1411385712',
            'filepath' => '201409/22/143512tcwqcct17kcx06tq.png',
          ),
          4 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1411385712',
            'filepath' => '201409/22/143512vpri9p0dxg201eu9.png',
          ),
          5 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1411385712',
            'filepath' => '201409/22/143512w9dyofakjfmox55k.png',
          ),
          6 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1411385711',
            'filepath' => '201409/22/143511si5mgjttgeanpepj.jpg',
          ),
          7 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1411385711',
            'filepath' => '201409/22/143511ms117zzh3syd517h.png',
          ),
          8 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1411385711',
            'filepath' => '201409/22/143511m3tjvbtihbvtwbbj.jpg',
          ),
        ),
      ),
      '16 2014 14:27' =>
      array (
        1 =>
        array (
          0 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410877674',
            'filepath' => '201409/16/172754j256inkjg22e7qiv.jpg',
          ),
        ),
      ),
      '16 2014 14:23' =>
      array (
        1 =>
        array (
          0 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410877427',
            'filepath' => '201409/16/172347skr75kzgm76jtokm.jpg',
          ),
        ),
      ),
      '16 2014 06:53' =>
      array (
        1 =>
        array (
          0 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410850427',
            'filepath' => '201409/16/095347a5zdkrddy5jb71b5.jpg',
          ),
        ),
      ),
      '13 2014 12:00' =>
      array (
        1 =>
        array (
          0 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410609615',
            'filepath' => '201409/13/150015s33zk7nhbh30hhs7.jpg',
          ),
        ),
      ),
      '12 2014 09:55' =>
      array (
        1 =>
        array (
          0 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515736',
            'filepath' => '201409/12/125536qfg7fggojojpr7h5.jpg',
          ),
          1 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515736',
            'filepath' => '201409/12/125536hkjedj93wfwyyy1g.jpg',
          ),
          2 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515736',
            'filepath' => '201409/12/125536mzcegegqrzc2zem0.jpg',
          ),
          3 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515736',
            'filepath' => '201409/12/125536m8vf9drkfykwf8gk.jpg',
          ),
          4 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515735',
            'filepath' => '201409/12/125535jpu83v88pq3qqjua.jpg',
          ),
          5 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515735',
            'filepath' => '201409/12/125535h1a1xx1xo6xyz627.jpg',
          ),
          6 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515735',
            'filepath' => '201409/12/125535jb29zd751ba92921.jpg',
          ),
          7 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515735',
            'filepath' => '201409/12/125535kpc93jpn43pbp7bn.jpg',
          ),
          8 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515734',
            'filepath' => '201409/12/125534zp2pap3pdopn1nae.jpg',
          ),
          9 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515734',
            'filepath' => '201409/12/125534c77r1x50rjzz60gh.jpg',
          ),
          10 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515733',
            'filepath' => '201409/12/125533vf2nck157fs57t0p.jpg',
          ),
          11 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515733',
            'filepath' => '201409/12/125533czi7qd4qedz4q56i.jpg',
          ),
          12 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515733',
            'filepath' => '201409/12/125533avoufwve12vnvfey.jpg',
          ),
          13 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515733',
            'filepath' => '201409/12/125533zsskjv70k0zkkoj5.jpg',
          ),
          14 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515733',
            'filepath' => '201409/12/125533at434dvolqrj34j3.jpg',
          ),
          15 =>
          array (
            'realname' => 'Кондратюк Сергей',
            'uid' => '1',
            'dateline' => '1410515732',
            'filepath' => '201409/12/125532ogrjhryjj3dg3r7g.jpg',
          ),
        ),
      ),
    )
    Вот содержимое массива $picsArr
     
  4. CAPAXA

    CAPAXA

    Регистр.:
    7 июн 2007
    Сообщения:
    896
    Симпатии:
    535
    Попробуйте использовать функцию обратного вызова ко всем элементам указанных массивов
    array_map
     
  5. SocMaster

    SocMaster aka Hakerok

    Регистр.:
    26 июл 2011
    Сообщения:
    202
    Симпатии:
    47
    Можно поподробнее? что даст использование этой функции?
     
  6. CAPAXA

    CAPAXA

    Регистр.:
    7 июн 2007
    Сообщения:
    896
    Симпатии:
    535
    Вы перебираете массив для внесения в него изменений.
    Это можно сделать через обратный вызов функции, которая поменяет значения для всего массива.
     
  7. SocMaster

    SocMaster aka Hakerok

    Регистр.:
    26 июл 2011
    Сообщения:
    202
    Симпатии:
    47
    Ага, почитал документацию. Не поможете с примером? не понял как эта функция заменит мне циклы
     
  8. Girt

    Girt Постоялец

    Регистр.:
    11 фев 2012
    Сообщения:
    87
    Симпатии:
    62
    Вот то, что тебе нужно, если я правильно понял (из приведённого кода не совсем понятно, что имеем, и что хотим получить)
    PHP:
    function fun($source$key)
    {
        global 
    $resultArr;
        
    $uid $source['uid'];
        
    $resultArr[$uid]['dateLine'] =  rus_month($source['dateline']);
        
    $resultArr[$uid]['userFullName'] = $source['realname'];
        
    $resultArr[$uid]['homeref'] = 'uid'.$source['uid'];
        if (!isset(
    $resultArr[$uid]['pic'])) $resultArr[$uid]['pic'] = [];
        
    $resultArr[$uid]['pic'][] = 'data/attachment/album/'.$source['filepath'];
      
    }
    $resultArr = [];

    array_walk($picsDataArr'fun');
    sort($resultArr);
     
  9. SocMaster

    SocMaster aka Hakerok

    Регистр.:
    26 июл 2011
    Сообщения:
    202
    Симпатии:
    47
    Из бд получаю список всех фото, в нем uid - номер юзера. дата dateline
    есть лента новостей, в ленте надо выводить блоки с фотками как новость. самый первый цикл собирает все фото по блокам. т.е новая минта новый блок


    $actualtime = gmdate("d Y H:i",$r['dateline']);// дата + час+минута
    $picsArr[$actualtime][$r['uid']][] = $r;// собираем все фото за дата + сортируем по юзерам.

    В итоге мне надо вывести блоки с фотками определенного юзера ну и по дате
    http://c2n.me/j0c3QY


    код выше не подходит, он просто собрал все фото в один массив для одного юзера. нет разделения по дате
     
  10. Girt

    Girt Постоялец

    Регистр.:
    11 фев 2012
    Сообщения:
    87
    Симпатии:
    62
    Пожалуйста:
    PHP:
    function fun($source$key)
    {
        global 
    $resultArr;
        
    $uid $source['uid'];
        
    $actualtime gmdate("d Y H:i",$source['dateline']);
        if (!isset(
    $resultArr[$actualtime])) $resultArr[$actualtime] = [];
        
    $resultArr[$actualtime][$uid]['dateLine'] =  rus_month($source['dateline']);
        
    $resultArr[$actualtime][$uid]['userFullName'] = $source['realname'];
        
    $resultArr[$actualtime][$uid]['homeref'] = 'uid'.$source['uid'];
        if (!isset(
    $resultArr[$actualtime][$uid]['pic'])) $resultArr[$actualtime][$uid]['pic'] = [];
        
    $resultArr[$actualtime][$uid]['pic'][] = 'data/attachment/album/'.$source['filepath'];

    }
    $resultArr = [];

    array_walk($picsDataArr'fun');
     
    Последнее редактирование: 30 сен 2014
    SocMaster нравится это.