Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Не все ли потеряно?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (5): [1] 2 3 4 5 »   

> Без описания
Zeross
Отправлено: 10 Августа, 2014 - 22:46:21
Post Id


Новичок


Покинул форум
Сообщений всего: 53
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Здравствуйте, я хотел бы узнать вот какой момент, обучаюсь по курсу "Специалист". Вот там в одном из курсов он дал задание описать встроенную функцию "count". То есть представить как будто её ещё нету в php, дал задание написать такую функцию самостоятельно! Так вот фишка в том что я даже приблизительно не смог её написать, я вообще думал что нужно делать её с помощью цикла, меньше число чем в массиве? значить ++))))) Но посмотрев курс дальше и посмотрев код препода, он сначала проверял тип через if и бла бла бла! кароч сделал то, что я даже не подозревал что нужно так. Вот я че хотел узнать не все ли у меня потеряно? так как меня этот момент очень насторожил! Заранее благодарен за ответы!
 
 Top
Мелкий Супермодератор
Отправлено: 10 Августа, 2014 - 22:52:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Напишите свой вариант, так будет более предметно, всё потеряно или ещё нет.

Свой count...
PHP:
скопировать код в буфер обмена
  1. function myCount(array $rgInput) {
  2.     $iCount = 0;
  3.     foreach ($rgInput as $null) {
  4.         ++$iCount;
  5.         }
  6.     return $iCount;
  7. }

Так что ли?


-----
PostgreSQL DBA
 
 Top
Zeross
Отправлено: 10 Августа, 2014 - 23:02:44
Post Id


Новичок


Покинул форум
Сообщений всего: 53
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Мелкий пишет:
Напишите свой вариант, так будет более предметно, всё потеряно или ещё нет.

Свой count...
PHP:
скопировать код в буфер обмена
  1. function myCount(array $rgInput) {
  2.     $iCount = 0;
  3.     foreach ($rgInput as $null) {
  4.         ++$iCount;
  5.         }
  6.     return $iCount;
  7. }

Так что ли?


Ну да, что то типа такого пытался сделать, только через While))) мб я не знаю где и какую функцию лучше использовать? например хз где лучше while а где foreach.

ну в принципе мой алгоритм был на верном пути, а вот код хз как написать)))))
 
 Top
OrmaJever Модератор
Отправлено: 10 Августа, 2014 - 23:14:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Мелкий пишет:
foreach ($rgInput as $null) {

Что за хипстерство, какой foreach? Подмигивание


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Zeross
Отправлено: 10 Августа, 2014 - 23:19:18
Post Id


Новичок


Покинул форум
Сообщений всего: 53
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




OrmaJever пишет:
Мелкий пишет:
foreach ($rgInput as $null) {

Что за хипстерство, какой foreach? Подмигивание


Оууу ребят тут тема не о том как написать функцию count, а о том что делать если совсем не получилось? не все ли потеряно если не получилось написать такой простой код? Говорю сразу практики нет совсем) только повторял за видео курсом)
 
 Top
Мелкий Супермодератор
Отправлено: 10 Августа, 2014 - 23:23:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




OrmaJever пишет:
Что за хипстерство, какой foreach?

Хм, ладно. Без foreach:
PHP:
скопировать код в буфер обмена
  1. (new ArrayIterator($rgInput))->count();

Радость
(Добавление)
Zeross пишет:
Оууу ребят тут тема не о том как написать функцию count

Дайте поразвлекаться чуток Подмигивание
(Добавление)
Zeross пишет:
практики нет совсем)

Потому и не получается.
Пишите. Пишите что-нибудь.
Могу сказать, что в начале и меня ставили в тупик простейшие задачи. Вроде понятно, что надо написать, а вот как?..


-----
PostgreSQL DBA
 
 Top
Vinyl
Отправлено: 11 Августа, 2014 - 12:20:48
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012  
Откуда: Армавир, Краснодарский край


Помог: 15 раз(а)




Мелкий, драсьте. А второй аргумент забыли? ))

PHP:
скопировать код в буфер обмена
  1. function myCount(array $rgInput, $rec = false) {
  2.  
  3.     $iCount = 0;
  4.  
  5.     foreach ($rgInput as $val)
  6.     {
  7.  
  8.         if($rec !== false && is_array($val))
  9.         {
  10.          
  11.              $iCount = $iCount + myCount($val, $rec);  
  12.              
  13.         }
  14.  
  15.         ++$iCount;
  16.  
  17.     }
  18.  
  19.     return $iCount;
  20. }
  21.  
  22. $array[] = 'Вася';
  23. $array[] = 'Петя';
  24. $array[] = 'Дима';
  25. $array[] = 'Я';
  26. $array[] = array('Антон','25 лет','Не судим');
  27.  
  28. echo myCount($array); //5
  29. echo myCount($array, 1); //8
  30.  


Zeross, спэшл фо ю, по строчкам:

1) Объявляем функцию. Указываем, какие аргументы нам нужны. В нашем случае аргумент $rgInput (сам массив, в котором нужно посчитать кол-во элементов) и необязательный аргумент $rec, который дает возможность посчитать все элементы многомерного массива. Если в списке аргументов присутствует оператор присваивания ($rec = false), это и означает, что параметр не обязательный.

3) Объявляем переменную, которая послужит нам счетчиком, и занесем в нее ноль. Мы же еще ничего не подсчитали, так?

5) В цикле перебираем элементы массива по одному (в одном уровне).

8) Проверяем, нужно ли считать уровни ниже. Если нужно, то проверяем, является ли текущий элемент массива массивом (масло масляное)) ).

Если да, то 11) Вызываем эту же функцию внутри нее самой (рекурсия). Она делает свои дела, и возвращает нам количество элементов уровнями ниже. Прибавляем число, возвращенное нашей ф-ей к нашему счетчику.

15) Прибавляем к нашему счетчику единицу. Это же тоже элемент массива, верно?

19) Возвращаем наш счетчик.

Проверяем. Заполним белибердой многомерный массив (22 - 26).
Вызываем нашу ф-ю, в которую передаем только первый аргумент - наш массив (28). Получаем 5. Все верно.
Вызываем нашу ф-ю, в которую передаем наш массив и второй аргумент, который подсчитает все элементы многомерного массива. Получаем 8. Все верно. Мы молодцы)


-----
Пессимисты пользуются die(), оптимисты - exit()
 
 Top
Мелкий Супермодератор
Отправлено: 11 Августа, 2014 - 12:29:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)





Vinyl пишет:
А второй аргумент забыли?

Честно говоря, да. Улыбка


-----
PostgreSQL DBA
 
 Top
Vinyl
Отправлено: 11 Августа, 2014 - 12:34:26
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012  
Откуда: Армавир, Краснодарский край


Помог: 15 раз(а)





Мелкий пишет:
OrmaJever пишет:

Что за хипстерство, какой foreach?


Хм, ладно. Без foreach:
PHP:
скопировать код в буфер обмена
  1. (new ArrayIterator($rgInput))->count();



А в объекте не встроенный ли count() используется, который нам переписать задали?


-----
Пессимисты пользуются die(), оптимисты - exit()
 
 Top
OrmaJever Модератор
Отправлено: 11 Августа, 2014 - 12:56:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




для численного массива достаточно обычного for или while
PHP:
скопировать код в буфер обмена
  1. function myCount( array $arr )
  2. {
  3.     $i=0;
  4.     while( isset( $arr[$i] ) ) ++$i;
  5.     return $i;
  6. }

для асоциативного я бы предложил использовать current и next
PHP:
скопировать код в буфер обмена
  1. function myAssocCount( array $arr )
  2. {
  3.     $i = 0;
  4.     while( current( $arr ) ) {
  5.         next( $arr );
  6.         ++$i;
  7.     }
  8.     return $i;
  9. }

а на самом деле в Си в структуре HashTable уже существует свойство nNumOfElements которое и содержит количество элементов массива.
Спойлер (Отобразить)


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
esterio
Отправлено: 11 Августа, 2014 - 13:00:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)





Я даже не знал что count может рекурсивно считать А?!
 
 Top
Мелкий Супермодератор
Отправлено: 11 Августа, 2014 - 13:05:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Vinyl пишет:
А в объекте не встроенный ли count() используется, который нам переписать задали?

Задали реализовать встроенную функцию count. А это - метод встроенного класса, а не функция! Головология чистого вида.

OrmaJever пишет:
для численного массива достаточно обычного for или while

Не совсем. Тот же array(null); сломает весь мир. Или любой массив с непоследовательным монотонным ключом или начинающийся не с 0.
Current'а тоже мало - цикл прервётся на первом же значении элемента, приводимом к нулю. + reset забыт.


-----
PostgreSQL DBA
 
 Top
Ch_chov
Отправлено: 11 Августа, 2014 - 13:05:59
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Если реккурсия не нужна, то можно без цикла посчитать:
PHP:
скопировать код в буфер обмена
  1. function myCount($array) {
  2.   return max(array_keys(array_keys($array))) + 1;      
  3. }
 
 Top
OrmaJever Модератор
Отправлено: 11 Августа, 2014 - 13:19:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Мелкий пишет:
Тот же array(null); сломает весь мир.

array(null) не сломает весь мир если написать current($arr) !== false, но тут же проблема, а что если в массиве будет false? Например

вернёт 2, потому что упёрся в false. Тупиковая ситуация какая-то Улыбка Плохая идея считать элементы Сишной структуры не имея к ней доступа Улыбка
Используя array_keys или подобные встроенные функции мне кажется тоже не очень честно, но с другой стороны по другому не как Растерялся


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Vinyl
Отправлено: 11 Августа, 2014 - 13:25:34
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012  
Откуда: Армавир, Краснодарский край


Помог: 15 раз(а)




Автор, отреагируйте как-нибудь. Что непонятно? )


-----
Пессимисты пользуются die(), оптимисты - exit()
 
 Top
Страниц (5): [1] 2 3 4 5 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB