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

Статус
В этой теме нельзя размещать новые ответы.

Jed7777

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

PHP:
<?php

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

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

array_walk($a, 'addPrefix', '102');
?>
 
без форичей и функций

PHP:
$a = array("a","s","d","f","g");
$dobavka="102";
for($i=0;$i<count($a);$i++)
{
   $a[$i]=$dobavka.$a[$i];
}
 
без форичей и функций

PHP:
$a = array("a","s","d","f","g");
$dobavka="102";
for($i=0;$i<count($a);$i++)
{
   $a[$i]=$dobavka.$a[$i];
}
ничего что у тебя при каждой итерации заново будет пересчитываться count($a)?
 
: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 Ну и мой конечно но не в практическом смысле )
 
Вот мой способ :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 Ну и мой конечно но не в практическом смысле )
В одну строку можно уместить скрипт в несколько мегабайт, это вообще не показатель чего-либо. А ваша функция мало того что неэффективна, так еще и нечитабельна.
P.S. мой вариант в 1 строку:
PHP:
$a = array("a","s","d","f","g");
while(list($k, $v) = each($a)) $a[$k] = '102'.$v;
 
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 место изначально ))
Но как говарится если под случай то всетаки ваш код лучший !
 
saen

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

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

Перестаньте напрегаться и оскорблять и либо примите полное поражение либо продемонстируйте реализацию которая будит работать быстрее всех примеров ну если получится 1 строкой то будит просто щикирно !
 
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];
}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху