PHP есть вопрос. Работа с массивами.

Тема в разделе "PHP", создана пользователем Jed7777, 7 май 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Jed7777

    Jed7777 Постоялец

    Регистр.:
    17 июл 2008
    Сообщения:
    136
    Симпатии:
    120
    Допустим есть массив
    $a = array("a","s","d","f","g");
    Нужно к каждому значению прибавить "102".
    То есть что бы на выходе получилось .
    Массив - array('102a',"102s","102d","102f","102g");
    Какой функцией можно это реализовать?
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    Например:
    PHP:
    $a = array("a","s","d","f","g");
    foreach(
    $a as $id=>$val){
        
    $a[$id] = '102'.$val;
        
    }
     
    Jed7777 нравится это.
  3. sergioFerro

    sergioFerro Писатель

    Регистр.:
    11 май 2008
    Сообщения:
    7
    Симпатии:
    0
    foreach - работает медленно

    PHP:
    <?php

    $a 
    = array("a","s","d","f","g"); 

    function 
    addPrefix(&$item1$key$prefix) {
        
    $item1 $prefix.$item1;
    }

    array_walk($a'addPrefix''102');
    ?>
     
  4. Igor123

    Igor123 Постоялец

    Регистр.:
    14 июн 2008
    Сообщения:
    116
    Симпатии:
    13
    без форичей и функций

    PHP:
    $a = array("a","s","d","f","g");
    $dobavka="102";
    for(
    $i=0;$i<count($a);$i++)
    {
       
    $a[$i]=$dobavka.$a[$i];
    }


     
  5. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    ничего что у тебя при каждой итерации заново будет пересчитываться count($a)?
     
  6. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    :D

    Вот мой способ :D Да я извращенец )) А вам слабо 1 строкой ?!
    Не знаю на сколько ресурсоемко но выглядеть устрашающе :D
    PHP:
    <?php
    $arr
    =array('a','s','d','f');
    $prefix='102';

    $arr=explode($prefix.'|=_=|'$prefix.implode($arr$prefix.'|=_=|'.$prefix));

    echo 
    '<pre>';
    print_r($arr);

    ?>
    Добавлено через 2 минуты
    Мне нравится способ sergioFerro Ну и мой конечно но не в практическом смысле )
     
  7. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    В одну строку можно уместить скрипт в несколько мегабайт, это вообще не показатель чего-либо. А ваша функция мало того что неэффективна, так еще и нечитабельна.
    P.S. мой вариант в 1 строку:
    PHP:
    $a = array("a","s","d","f","g");
    while(list(
    $k$v) = each($a)) $a[$k] = '102'.$v;
     
  8. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    1) Вы перевернули понятие 1 строки о которой я говарил!
    2) Код в котором отсутствует \n как минимум плохой тон
    3) Я говарю о функциональной строке которая выполняет задачу.
    4) Цыкл по правилам оформления как миниму 2 строки... Но с этим я не спорю.. Но все равно цыклы это 2 строки 1 вы инициализируете условия 2 то что делается по этому условию.. как то так )) я не мастер пояснять но думаю суть ясна...

    На счет нечитаемости:
    Ваш код я даже не понял )) пришлось лезть в чхмку за помощью...
    each - не пользовался и не слышал...

    Но все равно
    1) Ваш код не в 1 строку
    2) Ваш код так же сложно читаем как и мой хотя если разобраться... explode and implode мало каму не известны... по вашему нечитаемость в том что много раз написана переменная префикса !?
    3) С вашим кодом чудеса... :D

    Вот не поленил протестил на время исполнения в счет бралась только часть функциональная тоесть.

    1) Инициализация масива из 24 000 эллементов не бралась в расчет.
    2) Инициализация функций не бралась в расчет.

    Метод тестирования а вернее используемый код.

    PHP:
    <?PHP
    function microtime_float()
    {
        list(
    $usec$sec) = explode(" "microtime());
        return ((float)
    $usec + (float)$sec);
    }

        for (
    $i=0$i<10$i++)
        {
            
    $time_start microtime_float();

            while(list(
    $k$v) = each($a)) $a[$k] = $prefix.$v;

            
    printf ("<font color=#C0C0C0>Времени затрачено: %.30f sec</font><br>",microtime_float()-$time_start);
        }



    ?>
    Ну а теперь сводка:
    PHP:
    foreach($a as $id=>$val$a[$id] = $prefix.$val;
        
    Времени затрачено0.039872884750366210937500000000 sec
        Времени затрачено
    0.031689167022705078125000000000 sec
        Времени затрачено
    0.025300979614257812500000000000 sec
        Времени затрачено
    0.024485826492309570312500000000 sec
        Времени затрачено
    0.026400089263916015625000000000 sec
        Времени затрачено
    0.026623010635375976562500000000 sec
        Времени затрачено
    0.025132894515991210937500000000 sec
        Времени затрачено
    0.025781154632568359375000000000 sec
        Времени затрачено
    0.027385950088500976562500000000 sec
        Времени затрачено
    0.027029037475585937500000000000 sec
            Времени затрачено
    0.039872884750366210937500000000 sec

    array_walk
    ($a'addPrefix'$prefix);
        
    Времени затрачено0.074770927429199218750000000000 sec
        Времени затрачено
    0.067498922348022460937500000000 sec
        Времени затрачено
    0.060597896575927734375000000000 sec
        Времени затрачено
    0.053107023239135742187500000000 sec
        Времени затрачено
    0.057142019271850585937500000000 sec
        Времени затрачено
    0.056170940399169921875000000000 sec
        Времени затрачено
    0.061162948608398437500000000000 sec
        Времени затрачено
    0.070729017257690429687500000000 sec
        Времени затрачено
    0.061218023300170898437500000000 sec
        Времени затрачено
    0.060675144195556640625000000000 sec
            Времени затрачено
    0.074770927429199218750000000000 sec

    for($q=0$q<count($a); $q++) $a[$q]=$prefix.$a[$q];
        
    Времени затрачено0.037926912307739257812500000000 sec
        Времени затрачено
    0.039222955703735351562500000000 sec
        Времени затрачено
    0.027750015258789062500000000000 sec
        Времени затрачено
    0.025797128677368164062500000000 sec
        Времени затрачено
    0.027092933654785156250000000000 sec
        Времени затрачено
    0.028239011764526367187500000000 sec
        Времени затрачено
    0.028473854064941406250000000000 sec
        Времени затрачено
    0.026921987533569335937500000000 sec
        Времени затрачено
    0.026704072952270507812500000000 sec
        Времени затрачено
    0.026695966720581054687500000000 sec
            Времени затрачено
    0.039222955703735351562500000000 sec



    $a
    =explode($prefix.'|=_=|'$prefix.implode($a$prefix.'|=_=|'.$prefix));
        
    Времени затрачено0.032660961151123046875000000000 sec
        Времени затрачено
    0.033125162124633789062500000000 sec
        Времени затрачено
    0.032413005828857421875000000000 sec
        Времени затрачено
    0.027428150177001953125000000000 sec
        Времени затрачено
    0.028198957443237304687500000000 sec
        Времени затрачено
    0.030070781707763671875000000000 sec
        Времени затрачено
    0.030017852783203125000000000000 sec
        Времени затрачено
    0.034298181533813476562500000000 sec
        Времени затрачено
    0.039752006530761718750000000000 sec
        Времени затрачено
    0.036261081695556640625000000000 sec
            Времени затрачено
    0.039752006530761718750000000000 sec


    while(list($k$v) = each($a)) $a[$k] = $prefix.$v;
        
    Времени затрачено0.080676078796386718750000000000 sec
        Времени затрачено
    0.000017881393432617187500000000 sec
        Времени затрачено
    0.000015020370483398437500000000 sec
        Времени затрачено
    0.000013828277587890625000000000 sec
        Времени затрачено
    0.000015020370483398437500000000 sec
        Времени затрачено
    0.000015020370483398437500000000 sec
        Времени затрачено
    0.000013828277587890625000000000 sec
        Времени затрачено
    0.000014066696166992187500000000 sec
        Времени затрачено
    0.000015020370483398437500000000 sec
        Времени затрачено
    0.000014781951904296875000000000 sec
            Времени затрачено
    0.080676078796386718750000000000 sec

    for($q=0$q<count($a); $q++) $a[$q]=$prefix.$a[$q];
    Времени затрачено0.039222955703735351562500000000 sec

    $a
    =explode($prefix.'|=_=|'$prefix.implode($a$prefix.'|=_=|'.$prefix));
    Времени затрачено0.039752006530761718750000000000 sec

    foreach($a as $id=>$val$a[$id] = $prefix.$val;
    Времени затрачено0.039872884750366210937500000000 sec

    array_walk
    ($a'addPrefix'$prefix);
    Времени затрачено0.074770927429199218750000000000 sec

    while(list($k$v) = each($a)) $a[$k] = $prefix.$v;
    Времени затрачено0.080676078796386718750000000000 sec
    Ну вот )) До последнего надеялся выйграть )))) Ну что 2 место тоже результат особенно который изначально не ждал !

    Так что зря вы так мой код теперь вполне заслуживает внимания!!!

    По поводу сводки:
    Сначало идет функциональный код далее 10 результатов далее максимум из 10 в конце отсортерованый список по максимуму.

    Пример с while тестировался в цыкле поэтому взят 1 результат остальные в принцепи отброжены так как если убрать цыкл и повторить код 10 раз итог примерно одинаков.
    Дело в том что функция each не передвигала заного эллемены а брала постоянно последний.

    PS. Сори за ошибки 7 утра всетаки ))

    Добавлено через 3 минуты
    saen
    Сегодня не ваш день...
    Мало того что код тормазит так еще и на облодателя 1 места ни за что наехали...

    PS. На счет 1 кода все ещё 1 место за мной !!!
    Ну что кто рискнет реализовать в 1 строку да ещё и быстрее !?

    Добавлено через 25 минут
    for($q=0; $q<count($a); $q++) $a[$q]=$prefix.$a[$q];
    Код быстр но 1 неувязочка это работа только с неасоциативным масивом и при этом ключи должны идти с 0 и далее по порядку.
    Безопасно делать тогда array_values() а это соответственно дополнительное время а именно "Времени затрачено: 0.011640071868896484375000000000 sec"

    Теперь вы не на 1 месте )) наконец токи я на 1 месте :yahoo:

    $a=explode($prefix.'|=_=|', $prefix.implode($a, $prefix.'|=_=|'.$prefix));

    Код бастрый но убивает асоциативные ключи и на выходе не асоциативный масив.

    foreach($a as $id=>$val) $a[$id] = $prefix.$val;
    Код по свойму хорош и в принцепи если по юзабилити то выходит на 1 место апять токи смещяя меня ((((


    Тут говарить неочем... юзабилити есть но код как черепаха ((
    array_walk($a, 'addPrefix', $prefix);
    while(list($k, $v) = each($a)) $a[$k] = $prefix.$v;

    Если по времени то

    I место Inviseble_Demon
    II место KillDead
    III место Igor123

    Если по юзабилити и времени

    I место KillDead
    II место Inviseble_Demon
    III место Igor123


    Всетаки Igor123 зря вам было отдано 1 место изначально ))
    Но как говарится если под случай то всетаки ваш код лучший !
     
  9. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    saen

    1) Оскорбления вас не красят а только указывают на вашу неспособность доказать свою точку зрения.
    2) :D А что именно вы хотели показать тем что while быстрее for ? Давайте ещё длину переменной обсудим )) Я сравнивал итоговый код обработки а не цыклы. Так что ничего вы не доказали тем что сравнили цыклы ))
    3) Почитайте о стандартах оформления PHP кода. Не в 1 из стилей не оговаривается о том что цыклы это 1 строка. Ну конечно стиль может быть и свободный но все же мы говорим не об этом... Мой код подходит под определение одно строчного при применении любого из стилей.

    Вы хоть немного понимаете о чем говорите ?
    Какая разница какой цыкл быстрее !? главное итог обработки гласит о том что ваш метод тормазнутая забухавшаяся черепаха без 3 лап !

    Перестаньте напрегаться и оскорблять и либо примите полное поражение либо продемонстируйте реализацию которая будит работать быстрее всех примеров ну если получится 1 строкой то будит просто щикирно !
     
  10. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    1) Если пропустить твою полную безграмотность орфографии русского языка, цикл может быть задан одной строкой, если внутри тела этого цикла выполняется одна единственная операция.
    2) Я абсолютно понимаю о чем говорю, это в отличие от тебя. Твой так называемый "итог обработки" напрямую зависит от скорости исполнения цикла.
    3) Я ни с кем не соревнуюсь, а предоставляю еще 1 способ реализации. Об этом было написано выше. И не надо думать, что ты умнее всех, если используешь однострочные лямбда-функции(надеюсь ты знаешь что это такое), которые интерпритатор все равно переводит в циклы.

    4) Вот тебе пара вариантов на тестирование:

    1-й вариант:
    PHP:
    $a = array("a","s","d","f","g");
    $c sizeof($a);
    while(
    $c>0)
    {
        --
    $c;
        
    $a[$c] = '102'.$a[$c];
    }
    2-й вариант:
    PHP:
    $a = array("a","s","d","f","g");
    for(
    $i=0,$c=sizeof($a);$i<$c;++$i)
    {
        
    $a[$i] = '102'.$a[$i];
    }
     
Статус темы:
Закрыта.