Вывод из массива повторяющихся элементов.

Pack

Новичок
Вывод из массива повторяющихся элементов.

Помогите пожалуйста разобраться. Изучаю PHP около недели. Придумал себе задачку. Надо вывести из массива при помощи цикла while повторяющиеся элементы. Если делать без цикла, а просто при помощи оператора if, то выводится только первый элемент и всё. Что только не перепробовал. Искал в книгах, в faq. Ничего конкретного. Остановился на следующем коде.
PHP:
<?php
$i=0;
$b = array('3.12', 'Вова', '21.12', 'Коля', '22.12', 'Миша');
   if (in_array($date, $b) > 0) {
      while ($b[$i] < count($b)) {
         $array_search = array_search("$date", $b, true);
         $res = ++$array_search;
         echo "$date родился $b[$res]";
         $i = $array_search;
}
}
   else {
   echo "Сегодня без ДР.";
}
?>
Только он выводит сообщение в случае, если искомого элемента в массиве нет. Подскажите пожалуйста хоть в каком направлении думать.
 

Фанат

oncle terrible
Команда форума
Тут - нет. Но он прав - такая задача решается типом массива. Либо парой ключ-значение, либо вложенными массивами, когда массив содержит в себе три массива из двух элементов.

Но в качестве учебного примера твой вполне годится.
Только я не очень понимаю, что значит "вывести повтояющиеся элементы". Вроде бы, у тебя задача вывести все элементы?
 

Pack

Новичок
*****
Я знаю, что задачу можно решить проще. Но я именно так хочу. У меня задача найти (в данном примере) у кого сегодня ДР и вывести сообщение об этом. Вывести первое найденное значение без проблем, а вот чтобы обнаружилось следующее такое же значение и произошёл ещё один вывод как сделать я не понимаю. Опыта наверное не хватает. :)
То есть если массив будет выглядеть так: $b = array('23.12', 'Вова', '23.12', 'Коля', '22.12', 'Миша');, то вывести мне надо: "23.12 родился Вова 23.12 родился Коля"
Вот.
 

Фанат

oncle terrible
Команда форума
Ну блин тогда выбери что-нибудь одно - или array_search или цикл.

Вообще, нафига себе усложнять задачу?
Зчем тебе в массиве миши и васи, если ты не в состоянии даже без них что-то найти?
Оставь в массиве только даты, и в цикле, с помощью if выведи столько сегодняшние.
 

Beavis

Banned
$b = array('23.12', 'Вова', '23.12', 'Коля', '22.12', 'Миша');

и вообще мне кажется, такой вид массива неудобный... лучше чтоб элементы массива были однотипные: т.е. массив дат или массив имен, или двумерный массив с именами и датами, или ассоциативный типа Имя => Дата
тогда с массивом будет удобнее работать
 

Pack

Новичок
А array_search и цикл вместе нельзя?

-~{}~ 23.12.07 18:11:

Beavis
Я знаю, что неудобный. Это не принципиально. Мне надо, чтобы если 2 даты повторяющиеся, то чтобы выводились обе, а не только первая.

-~{}~ 23.12.07 18:13:

Вообще скорее всего у меня неправильно задано условие в цикле, но я не понимаю, как сделать иначе...
 

Beavis

Banned
Pack
ты конечно молодец что ставишь сам себе задачи и пытаешься их решить, но в данном случае ты поставил себе глупую задачу!
но если ты такой принципиальный - то сначала отвлекись от PHP и придумай алгоритм её решения, и только потом переводи алгоритм в PHP, а то ты нагородил кучу всего и запутался уже как это работает
 

Pack

Новичок
Beavis
Вот упрощённый вариант. Алгоритм явно просматривается. Только не понимаю, как условие правильно записать в цикле. Много чего перепробовал уже.
PHP:
<?php
$b = array('3.12', '21.12', '22.12');
while (????????) {
   if ($b[$i] = $date) {
      echo "$date";
      $i++;
}
   else {
      echo "Нет совпадений.";
}
}
?>
 

Beavis

Banned
Pack
ты сначала определись зачем тебе нужен цикл и тем более WHILE
 

Pack

Новичок
Beavis
Вот хочу я сделать именно циклом. Ты скажи лучше, возможно это вообще или нет? И как сделать подскажи, если знаешь.
 

Beavis

Banned
Pack
Пока ты сам не поймешь что должен делать твой цикл - дальнейший разговор бесполезен.
 

Фанат

oncle terrible
Команда форума
Pack
так ты ж писал уже условие в цикле?
а сейчас что тебя останавливает?
 

Pack

Новичок
Beavis
Цикл должен проверять каждый элемент массива, соответствует ли он сегодняшней дате, и, если соответствует или не соответствует, выводить сообщение.
 

Beavis

Banned
Pack
нет. проверять каждый элемент массива должно условие IF , а цикл должен ПЕРЕБИРАТЬ ВСЕ ЗНАЧЕНИЯ МАССИВА которые необходимо проверить.
И цикл WHILE подходит для этой задачи меньше всего. Ты слышал про цикл FOR ?
 

Фанат

oncle terrible
Команда форума
цикл ничего не проверяет. цикл только повторяет лежащие внутри него команды.
а проверяет другой оператор
 

Pack

Новичок
Вот последний вариант:
PHP:
<?php
$i = 0;
$b = array('3.12', '21.12', '22.12');
while ($i < count($b)) {
   if ($b[$i] = $date) {
      echo "$date";
      $i++;
}
   else {
      echo "Нет совпадений.";
}
}
?>
Не понимаю почему, но выводится 3 раза подряд сегоднешняя дата...
 

Beavis

Banned
Pack
почему ты именно WHILE используешь?)) разве с FOR не проще?))
PHP:
	$b = array('3.12', 'Вова', '21.12', 'Коля', '22.12', 'Миша', '21.12', 'Петя'); 
	for ($i=0; $i<count($b); $i+=2) 
		if ($b[$i] == $date) printf("У %s день рождения %s<br />", $b[$i+1], $b[$i]);
и постарайся соблюдать структуру документа, тогда будет наглядно видно какой оператор к какому блоку относится
 
Сверху