Автор Тема: array_search  (Прочитано 5017 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Abram

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 116
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
array_search
« : 29 Июля 2003, 15:30:44 »
Есть масив : 1 2 3 4 5 2 6 4  Нужно отобрать те елементы которые повторяются.
Пишу :
for ($i=0;$i<=count($mas);$i++)
{

$k=array_search($mas[$i],$mas);
if($k)
{
   echo $k;
}
}
выводит список всех индексов. Как сделать чтобы только те которые повторяются?(в данос случае(5 и 7)

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #1 : 29 Июля 2003, 16:15:42 »
[p]array_count_values[/p]

Оффлайн MrGreeN

  • просто зелёный
  • Постоялец
  • ***
  • Сообщений: 195
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #2 : 29 Июля 2003, 16:32:15 »
Прошу прощения что влез в чужой топик, но уж больно тема схожая
//-----------Массив-----------
Массив передающийся в ф-цию имеет вид
  • [Id док-та][имя док-та]....
  • [1]
[Id док-та][имя док-та]....и т.д.
.......................................
А вот вернуть надо массивчик отсортированный в порядке убывания по количеству встречающихся одинаковых записей...
//-----------Ф-ция------------
function endarr($initarrf)
{
$tmp1[0]=$initarrf[0]["Doc_ID"]; //формируем чего-то типа списка присутсвующих ID документов
$i=0;
foreach($initarrf as $rowarr)
foreach($rowarr as $key=>$val)
if(($key=="Doc_ID")&!in_array($val,$tmp1))
{
$i++;
$tmp1[$i]=$val;
}
foreach($tmp1 as $val) $tmp[$val]=0; //Формируем количество одинаковых по ID документов
foreach($initarrf as $rowarr)
foreach($rowarr as $key=>$val)
if($key=="Doc_ID")
if (array_key_exists($val, $tmp))
{
$tmp[$val]=$tmp[$val]+1;
}
arsort($tmp); // Сортируем их по убыванию
$i=0;
foreach($tmp as $key=>$val)
{
$k=array_search($key,$k); // <-(ВОПРОС)Как бы извлечь ключ по значению?
$countarrf[$key]["Doc_full_name"]=$initarrf[$k]["Doc_full_name"];
$countarrf[$key]["count"]=$val;
$countarrf[$key]["Phys_way"]=$initarrf[$k]["Phys_way"];
$i++;
}
return $countarrf;
}

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #3 : 29 Июля 2003, 16:43:36 »
ничё не понял.
скорее всего, задача из тех, что решаются до того, как придешь к такой проблеме.
откуда у тебя этот самый первый массив берется?
Небось из базы?

Зачем в твоем примере СТОЛЬКО циклов - я не понял.
тут же, при самом "в лоб" решении - только один (явный).
перебрать этот массив, создавая другой, кде ключом является ид документа и есть элемент - количество.
ну, или массив - с индексами самого первого массива.
и 1 usort который по этому полю сортирует

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #4 : 29 Июля 2003, 16:54:09 »
почему у тебя ключами $tmp являются не ид документа, что должно быть естественно, а опять какие-то цыферки?

Оффлайн MrGreeN

  • просто зелёный
  • Постоялец
  • ***
  • Сообщений: 195
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #5 : 29 Июля 2003, 17:11:12 »
Это вариант статистики электронной библиотеки, для того чтобы узнать книга с каким ID более всего пользуется спросом, ну и соответсвенно в самой базе каждому скачиванию соответствует своя запись с уникальным порядковым номером ( там где у меня 0  и 1 и.т.д.).
Ну намёк то я понял (насчёт первоначального определения ключа), но тут такая штука есть, что юзеры могут работать и в локалке и тогда совпадает всё кроме ключа в самой базе (ну там и времени :)), а делать вместо одного запроса к базе два или три (т.к. сначала выводиться общая статистика, а при введении пароля администратора расширенная с указанием IP адресов, времени, логина юзера и т.д. по конкретному ID документа) не есть совсем корректно ( в смысле траффика и времени, IIS и скуль на разных машинах), по-этому и хочу всё в один впихнуть....Ну а куча циклов создаёт кучу вспомогательных массивов (для админа) в которой и будет самая необходимая инфа.....Ну ладно это я обрисовал  чего за цель....
А вообще можно-ли извлечь ключ из двумерного ассоциативного массива (ну и выражение написал:)), по значению и если значений несколько, то вернуть первое которое встретится?

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #6 : 29 Июля 2003, 17:14:30 »
извлесь можно все, но поскольку ты делаешь неправильно, то не вижу никакого смысла тебе что-то отвечать.
Если хочешь и дальше развивать свою заумную писанину вместо того, чтобы сделать просто - то читай ман сам.
там все написано.

Оффлайн MrGreeN

  • просто зелёный
  • Постоялец
  • ***
  • Сообщений: 195
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #7 : 29 Июля 2003, 17:15:27 »
Неее,  в tmp у меня уже ключ и есть ID, а значение- кол-во повторяющихся записей (ну типа склько раз скачали доку),
 а вот в tmp1, там действительно цыферки..

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #8 : 29 Июля 2003, 17:16:58 »
обычно всю станистику можно посчитать в самой базе.
если ее грамотно спроектировать, конечно.

если ты одним запросом это все выдергиваешь - какая проблема сделать этому запросу order by?

Оффлайн MrGreeN

  • просто зелёный
  • Постоялец
  • ***
  • Сообщений: 195
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #9 : 29 Июля 2003, 17:17:23 »
Хотя да, итерации с обоими tmp можно объединить в одну

Оффлайн MrGreeN

  • просто зелёный
  • Постоялец
  • ***
  • Сообщений: 195
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #10 : 29 Июля 2003, 17:25:07 »
Проблема то не в групировке, а в извлечении...
 А в мане есть конечно всё, но как писать статистику - нету...
Ничего тут заумного нет (если пропустить объяснения для чего оно надо), просто надо извлечь...
А нет - так нет, будем велосипед изобретать...:)

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #11 : 29 Июля 2003, 17:26:48 »
родной, ты с кем сейчас разговариваешь?
у тебя форум служит для бесед с самим собой?
заведи себе свой собственный.
Цитировать
тогда совпадает всё кроме ключа в самой базе

и как я должен догадываться - какой из элементов твоих массивов имеется в виду?
я-то пологал, что "ключ в базе" - это "ид документа".
А насамом деле это что?
И какая проблема сделать все за один цикл?

и что это за база такая, в которой по каждому скачиванию пишется вся инфа по документу, а не сосбтвенно число скачиваний?

В конце концов, если уж так уж жалко базу, то апдейть просто базу книг, в поле скачиваний прибавляй единичьку

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #12 : 29 Июля 2003, 17:29:09 »
короче, пусть тебе кто-нибудь другой помогает.
сделать проще ты не хочешь, свой путь считаешь единственно верным, ни структуры базы, ни запросов не привел
а так - в слепую - я не люблю.
ответы на форуме - дело добровольное.
если я не вижу смысла в решаемой задаче, и мне не могут его внятно объяснить (а значит - и себе), то желание заниматься такой проблемой совершенно пропадает.

Оффлайн MrGreeN

  • просто зелёный
  • Постоялец
  • ***
  • Сообщений: 195
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #13 : 29 Июля 2003, 17:35:03 »
Ох, ромик ромик...Ну зачем так кипятится?
 Да я грешным делом подумал что с тобой вроде общаюсь
-  Что за ключ я написал во втором посте.....

-  И чего это получиться? Для каждого док-та заводить отдельную таблицу в которую будут вбиваться и учётная запись пользователя и его IP и время и т.д.?

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
array_search
« Ответ #14 : 29 Июля 2003, 17:54:06 »
ну ты загнул!
откуда ты взял такую идею?
я, вроде, о запросах говорил, а не о таблицах

вот тебе пример простого запроса, который по двум таблицам считает и сортирует
честно говоря, я даже не представляю, как ты обходишься без чего-то подобного...
select count(l.id) as c,name from  log l, books b where b.id=l.book_id group by book_id order by c desc;

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28