imediasun
21.05.2013 - 06:04
Есть функция для определения существует ли значение в массиве in_array
$existing_users=array('111','mike','jason');
$user_name=$this->input->post('code');
if (in_array($user_name, $existing_users))
{
echo "no";
}
else
{
echo "yes";
}
Почему разные реакции на разные массивы. Если массив такой
Array
(
[0] => Array
(
[code] => 111
)
[1] => Array
(
[code] => 111
)
[2] => Array
(
[code] => 111
)
)
ответ yes
Если же такой
Array
(
[0] => 111
[1] => 111
[2] => 111
)
ответ no
И как преобразовать многомерный массив в такой чтобы функция in_array нашла в нем значение 111
paul85
21.05.2013 - 06:32
in_array()
работает только с одномерными массивами. Можно сделать, навскидку, так:
$final_array=array();
foreach ($existing_users as $row)
{
$final_array[]=$row['code'];
}
if (in_array($user_name, $final_array))
{
echo "no";
}
else
{
echo "yes";
}
Или посмотрите, может быть есть возможность враппера MySQL отдавать один столбец одномерным массивом. В GoDB, например, такое реализовано.
Игорь_Vasinsky
21.05.2013 - 07:02
на вскидку лучше сделать рекурсивный аналог in_array()
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
paul85
21.05.2013 - 07:21
Игорь_Vasinsky, в данном случае ИМХО нет.
Игорь_Vasinsky
21.05.2013 - 07:32
функция быстрей от
работаетто что функция быстрей от
работает - это и ежу понятно, + - она на неограниченную вложенность всё проверит
function in_array_recursive($needle, $array){
foreach($array as $value){
if(is_array($value))
return in_array_recursive($needle, $value);
else{
if($needle == $value)
return true;
}
}
return false;
}
$str = 'boy';
$arr_one_level = array('tree','boy','table','street');
$arr_more_level = array(array('tree','boy'), array('street','count'));
(bool)var_dump(in_array_recursive($str, $arr_one_level));
(bool)var_dump(in_array_recursive($str, $arr_more_level));
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
paul85
21.05.2013 - 17:21
Цитата |
то что функция быстрей отработает - это и ежу понятно |
Игорь_Vasinsky, к сожалению мне непонятно. Если не сложно, поясните почему...
Про универсальность абсолютно согласен, хотя конкретно здесь она не нужна. Дело только лишь в скорости.
Игорь_Vasinsky
21.05.2013 - 18:12
paul85
Ну потому что здесь для различных алгоритмов и различных споров несколько раз доказывалось - что функция быстрее отработает нежели просто алгоритм без обёртки.
причину не могу назвать, не вникал. просто видно было по результатам.
возможно потому что php интерпретатор и инициализированная функция - как код садиться сразу в память или как...
это всего лишь предположение.
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
paul85
21.05.2013 - 21:08
Однако я немало удивлен! Надо будет посмотреть почему так происходит...
Игорь_Vasinsky, спасибо за информацию.
Цитата (Игорь_Vasinsky @ 21.05.2013 - 14:12) |
paul85 Ну потому что здесь для различных алгоритмов и различных споров несколько раз доказывалось - что функция быстрее отработает нежели просто алгоритм без обёртки.
|
Как же я это пропустил...
В данном случае это не верно. Если не нужна вложенность (а она не нужна), то без рекурсии будет
работать в два раза быстрее. Просто нужно немного изменить алгоритм и не гонять цикл вхолостую.
$str = 'boy';
$arr_more_level = array(array('tree','boy'), array('street','count'));
$flag = false;
foreach ($arr_more_level as $row)
{
if(in_array($str, $row))
{
$flag = true;
break;
}
}
if ($flag)
{
echo "no";
}
else
{
echo "yes";
}
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Игорь_Vasinsky
21.05.2013 - 22:09
Цитата |
if(in_array($str, $row)) |
ну теоретически там может быть не массив. теоритически.
программисты должны глядет на шаг вперёд. (можно использовать в новом видео
)
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Да я просто тест делал для замера скорости. Тут не в массивх дело, а в рекурсии. Не знаю кто чего там доказывал, но твой пример явно не из той оперы.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Игорь_Vasinsky
21.05.2013 - 22:20
ну так покажи с каким кодом мерял то.
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Убил уже. Ну твою функцию и свой код мерял. Хочешь, сам померяй. Ровно в два раза получилось быстрее у меня. Оно и не мудрено...
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Игорь_Vasinsky
21.05.2013 - 22:29
твой выше код - как я писал - будет работать только с 2х уровневым массивом
я же написал для другого.
как их вообще мерять можно было.
вон в первом посту я щас подметил - что задача под ассоц массив из БД - это как правило под 2х уровневые массивы, но не факт как будет собран результирующий массив -2 уровня, или 3 и т.д.
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Цитата (Игорь_Vasinsky @ 21.05.2013 - 18:29) |
твой выше код - как я писал - будет работать только с 2х уровневым массивом я же написал для другого.
как их вообще мерять можно было.
вон в первом посту я щас подметил - что задача под ассоц массив из БД - это как правило под 2х уровневые массивы, но не факт как будет собран результирующий массив -2 уровня, или 3 и т.д. |
Причем тут массивы вообще. Меня они не интересовали как таковые. Собственно топикстртеру оба алгоритма бы подошли.
Меня вот это зацепило:
Цитата |
то что функция быстрей отработает - это и ежу понятно, |
Цитата |
функция быстрее отработает нежели просто алгоритм без обёртки. |
Чет ты тут прогнал немного. С рекурсией то точно.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.