$ar = array('id' => '8', 'name' => 'moha');
вот в это
`id` = :id, `name` = :name
без использования foreach.
Спустя 5 минут, 19 секунд (27.03.2012 - 14:24) ADiel написал(а):
array_keys, implode
Вот только входящий массив не должен быть пустой, а то получишь
$arr = array_keys(твой массив);
$str = "(:".implode(", :",$arr).")";
Вот только входящий массив не должен быть пустой, а то получишь
(:)
Спустя 1 минута, 43 секунды (27.03.2012 - 14:25) killer8080 написал(а):
Цитата (m4a1fox @ 27.03.2012 - 13:18) |
без использования foreach. |
А смысл?

Спустя 45 секунд (27.03.2012 - 14:26) ADiel написал(а):
Цитата (killer8080 @ 27.03.2012 - 11:25) | ||
А смысл? ![]() |
Для морального удовлетворения и красивого кода

+ оно в 4 раза быстрее, чем foreach. Лично проверил
Спустя 34 секунды (27.03.2012 - 14:27) m4a1fox написал(а):
ADiel
Try it.... Я тут пытаюсь смастерить такую конструкцию.....
Эксперименты ставлю.... Пока что вот к чему пришел
Но результат не тот.
Try it.... Я тут пытаюсь смастерить такую конструкцию.....
Эксперименты ставлю.... Пока что вот к чему пришел
$do = array(
'id' => '1',
'name' => 'this is one' );
echo implode(' = :'.implode(array_keys($do)).' ', array_keys($do));
Но результат не тот.
Спустя 1 минута, 56 секунд (27.03.2012 - 14:29) ADiel написал(а):
Я как то упустил key = :key..
Попробуй array_map задействовать
Попробуй array_map задействовать
Спустя 12 секунд (27.03.2012 - 14:29) m4a1fox написал(а):
ADiel
Спасибо конечно... но твой результат тоже не верен.
Я ж говорю вот из этого
Спасибо конечно... но твой результат тоже не верен.
Я ж говорю вот из этого
Цитата |
$ar = array('id' => '8', 'name' => 'moha'); |
сделать вот это
Цитата |
`id` = :id, `name` = :name |
Спустя 35 секунд (27.03.2012 - 14:29) m4a1fox написал(а):
ADiel
Цитата |
Попробуй array_map задействовать |
О. Ништяк. Я про нее и забыл. Так, полез в маны.
Спустя 1 минута, 19 секунд (27.03.2012 - 14:31) ADiel написал(а):
function build($key){
return "`{$key}` = :{$key}";
}
$arr = array_map("build",array_keys(твой массив));
$str = "(".implode(", ",$arr).")";
Спустя 2 минуты, 23 секунды (27.03.2012 - 14:33) m4a1fox написал(а):
ADiel
Да да да. Только что сам забацал.
Вот так
Спс. Я про array_map как-то и забыл.
Да да да. Только что сам забацал.
Вот так
function tryArray($str){
return '`'.$str.'` = :'.$str;
}
$to = array_map("tryArray", array_keys($do));
echo implode(', ', $to);
Спс. Я про array_map как-то и забыл.
Спустя 2 минуты, 22 секунды (27.03.2012 - 14:35) m4a1fox написал(а):
Я тут по извращался над этим процессом, и вот такой монстр родился....
Причем момент с ананимной(ох если память не изменяет - лямбда) функцией, кажется где в статьях Winston'a видел. Так что и ему спс.
echo implode(', ', array_map(function($str){return '`'.$str.'` = :'.$str;}, array_keys($do)));
Причем момент с ананимной(ох если память не изменяет - лямбда) функцией, кажется где в статьях Winston'a видел. Так что и ему спс.
Спустя 1 минута, 15 секунд (27.03.2012 - 14:37) ADiel написал(а):
А теперь вопрос. Это быстрее цикла?
Думаю, нужно померить 10000 итераций =)
Думаю, нужно померить 10000 итераций =)
Спустя 1 минута, 6 секунд (27.03.2012 - 14:38) m4a1fox написал(а):
ADiel
Цитата |
А теперь вопрос. Это быстрее цикла? Думаю, нужно померить 10000 итераций =) |
Вопрос был не в скорости. Думаю по скорости цикл выиграет, вопрос был в принципе. КАК ЭТО СДЕЛАТЬ? Хотя можно проверить..... Кто тестанёт?
Спустя 1 минута, 32 секунды (27.03.2012 - 14:39) ADiel написал(а):
Я щас на винде.. Но перезагружусь =) Самому интересно же

Спустя 4 минуты, 52 секунды (27.03.2012 - 14:44) m4a1fox написал(а):
ADiel
Ok! Потом сравним. Я тоже тест провожу.
Ok! Потом сравним. Я тоже тест провожу.
Спустя 43 секунды (27.03.2012 - 14:45) killer8080 написал(а):
Цитата (ADiel @ 27.03.2012 - 13:26) |
Для морального удовлетворения и красивого кода + оно в 4 раза быстрее, чем foreach. Лично проверил |
Что быстрее?

Быстрее чем foreach с массивами ни что не работает в пхп
m4a1fox
если не изменят память, лямбда функции появились только в php>=5.3, для более ранних версий нужно использовать create_function
$ar = array('id' => '8', 'name' => 'moha');
echo implode(', ', array_map(create_function('$v', 'return "`".$v."` = :".$v;'), array_keys($ar)));
Спустя 6 минут, 39 секунд (27.03.2012 - 14:52) ADiel написал(а):
0.03132700920105 - array_map
0.016868114471436 - foreach + implode
Спустя 2 минуты, 20 секунд (27.03.2012 - 14:54) ADiel написал(а):
Цитата |
Быстрее чем foreach с массивами ни что не работает в пхп |
array_keys + implode быстрее в 4 раза. я измерял. Вот только у меня была задача перечислить параметры с : через запятую. А тут строить строчку приходится.
Спустя 1 минута, 2 секунды (27.03.2012 - 14:55) m4a1fox написал(а):
killer8080
Цитата |
если не изменят память, лямбда функции появились только в php>=5.3, для более ранних версий нужно использовать create_function |
Да, вполне возможно.
Спустя 36 секунд (27.03.2012 - 14:55) ADiel написал(а):
Вот тест:
<?php
/**
* Класс замера времени в секундах
* @author Плотников Илья
* @author ilyaplot@gmail.com
* @example
$time = new TimeTest();
usleep(1000000);
echo $time->getResult();
// Выведет 1.0003161430359
* @return float Время выполнения
*/
class TimeTest {
private $start = 0;
function __construct(){
$this->start = $this->getTime();
}
function getTime(){
list($usec, $seconds) = explode(" ", microtime());
return $usec + $seconds;
}
function getResult(){
return $this->getTime()-$this->start;
}
}
$arr = array();
for($i = 0; $i <10000; $i++){
$arr['field'.$i] = $i;
}
$time = new TimeTest();
$str = implode(', ', array_map(create_function('$v', 'return "`".$v."` = :".$v;'), array_keys($arr)));
echo $time->getResult(); #Время выполнения 0.034982919692993
$str = array();
echo "<br />";
$time = new TimeTest();
foreach($arr as $key=>$val)
$str[] = "`{$key}` = :{$key}";
$str = implode(", ",$str);
echo $time->getResult(); #Время выполнения 0.019673824310303
Спустя 4 минуты, 7 секунд (27.03.2012 - 15:00) killer8080 написал(а):
То же загорелся спортивный интерес
на 1000 итераций
foreach / array_map
0.0029091835022 / 0.00948905944824
на 1000 итераций
foreach / array_map
0.0029091835022 / 0.00948905944824
Свернутый текст
$ar = array('id' => '8', 'name' => 'moha');
$t = microtime(true);
$n = 0;
while($n < 1000){
$n++;
$i = 0;
echo '<!-- ';
foreach($ar as $k => $v){
if(++$i > 0) echo ', ';
echo "`".$k."` = :".$k;
}
}
echo ' -->';
echo '<br>'.(microtime(true) - $t);
echo '<hr>';
$t = microtime(true);
$n = 0;
echo '<!-- ';
while($n < 1000){
$n++;
echo implode(', ', array_map(function($str){return '`'.$str.'` = :'.$str;}, array_keys($ar)));
}
echo ' -->';
echo '<br>'.(microtime(true) - $t);
Спустя 3 минуты, 43 секунды (27.03.2012 - 15:03) ADiel написал(а):
Тот же код у меня
0.0044410228729248
0.011044979095459
Вот только у меня 10 000 итераций +)
0.0044410228729248
0.011044979095459
Вот только у меня 10 000 итераций +)
Спустя 4 минуты, 59 секунд (27.03.2012 - 15:08) killer8080 написал(а):
Разница стабильна, примерно в 3 раза foreach быстрее. Но тут нужно учитывать создание анонимных функций. В общем скорость выполнения достаточна, чтоб в боевых условиях не задумываться над экономией спичек

Спустя 33 минуты, 4 секунды (27.03.2012 - 15:41) ADiel написал(а):
ну да. зато элегантно
Спустя 2 часа, 14 минут (27.03.2012 - 17:55) m4a1fox написал(а):
Цитата |
ну да. зато элегантно |
Вот и я про это. Всем спасибо.