[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: массивы
Страницы: 1, 2
imediasun
Есть функция для определения существует ли значение в массиве in_array

//первый вариант - формирование
$existing_users=array('111','mike','jason');
//второй вариант - получение массива из базы //$existing_users=$this->billboards_model->get_col('code');

$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
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
на вскидку лучше сделать рекурсивный аналог 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
Игорь_Vasinsky, в данном случае ИМХО нет.
Игорь_Vasinsky
функция быстрей отработает

то что функция быстрей отработает - это и ежу понятно, + - она на неограниченную вложенность всё проверит

  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
Цитата
то что функция быстрей отработает - это и ежу понятно

Игорь_Vasinsky, к сожалению мне непонятно. Если не сложно, поясните почему...

Про универсальность абсолютно согласен, хотя конкретно здесь она не нужна. Дело только лишь в скорости.
Игорь_Vasinsky
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
Однако я немало удивлен! Надо будет посмотреть почему так происходит...

Игорь_Vasinsky, спасибо за информацию.
twin
Цитата (Игорь_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";
}


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Игорь_Vasinsky
Цитата
if(in_array($str, $row))

ну теоретически там может быть не массив. теоритически.
программисты должны глядет на шаг вперёд. (можно использовать в новом видео wink.gif )

_____________
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
twin
Да я просто тест делал для замера скорости. Тут не в массивх дело, а в рекурсии. Не знаю кто чего там доказывал, но твой пример явно не из той оперы.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Игорь_Vasinsky
ну так покажи с каким кодом мерял то.

_____________
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
twin
Убил уже. Ну твою функцию и свой код мерял. Хочешь, сам померяй. Ровно в два раза получилось быстрее у меня. Оно и не мудрено...

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Игорь_Vasinsky
твой выше код - как я писал - будет работать только с 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
twin
Цитата (Игорь_Vasinsky @ 21.05.2013 - 18:29)
твой выше код - как я писал - будет работать только с 2х уровневым массивом
я же написал для другого.

как их вообще мерять можно было.

вон в первом посту я щас подметил - что задача под ассоц массив из БД - это как правило под 2х уровневые массивы, но не факт как будет собран результирующий массив -2 уровня, или 3 и т.д.

Причем тут массивы вообще. Меня они не интересовали как таковые. Собственно топикстртеру оба алгоритма бы подошли.

Меня вот это зацепило:
Цитата
то что функция быстрей отработает - это и ежу понятно,

Цитата
функция быстрее отработает нежели просто алгоритм без обёртки.
Чет ты тут прогнал немного. С рекурсией то точно.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

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