[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Из массива в строку без foreach(){}
m4a1fox
Итаки всем доброго дня... Господа, помогите превратить вот это

$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.

А смысл? blink.gif

Спустя 45 секунд (27.03.2012 - 14:26) ADiel написал(а):
Цитата (killer8080 @ 27.03.2012 - 11:25)
Цитата (m4a1fox @ 27.03.2012 - 13:18)
без использования foreach.

А смысл? blink.gif

Для морального удовлетворения и красивого кода smile.gif
+ оно в 4 раза быстрее, чем foreach. Лично проверил

Спустя 34 секунды (27.03.2012 - 14:27) m4a1fox написал(а):
ADiel
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 задействовать

Спустя 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
Да да да. Только что сам забацал.
Вот так

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 написал(а):
Я тут по извращался над этим процессом, и вот такой монстр родился....
echo implode(', ', array_map(function($str){return '`'.$str.'` = :'.$str;}, array_keys($do)));

Причем момент с ананимной(ох если память не изменяет - лямбда) функцией, кажется где в статьях Winston'a видел. Так что и ему спс.

Спустя 1 минута, 15 секунд (27.03.2012 - 14:37) ADiel написал(а):
А теперь вопрос. Это быстрее цикла?
Думаю, нужно померить 10000 итераций =)

Спустя 1 минута, 6 секунд (27.03.2012 - 14:38) m4a1fox написал(а):
ADiel
Цитата
А теперь вопрос. Это быстрее цикла?
Думаю, нужно померить 10000 итераций =)

Вопрос был не в скорости. Думаю по скорости цикл выиграет, вопрос был в принципе. КАК ЭТО СДЕЛАТЬ? Хотя можно проверить..... Кто тестанёт?

Спустя 1 минута, 32 секунды (27.03.2012 - 14:39) ADiel написал(а):
Я щас на винде.. Но перезагружусь =) Самому интересно же smile.gif

Спустя 4 минуты, 52 секунды (27.03.2012 - 14:44) m4a1fox написал(а):
ADiel
Ok! Потом сравним. Я тоже тест провожу.

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

Что быстрее? user posted image
Быстрее чем 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

Свернутый текст
$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 итераций +)

Спустя 4 минуты, 59 секунд (27.03.2012 - 15:08) killer8080 написал(а):
Разница стабильна, примерно в 3 раза foreach быстрее. Но тут нужно учитывать создание анонимных функций. В общем скорость выполнения достаточна, чтоб в боевых условиях не задумываться над экономией спичек smile.gif

Спустя 33 минуты, 4 секунды (27.03.2012 - 15:41) ADiel написал(а):
ну да. зато элегантно

Спустя 2 часа, 14 минут (27.03.2012 - 17:55) m4a1fox написал(а):
Цитата
ну да. зато элегантно

Вот и я про это. Всем спасибо.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.