Форумы портала PHP.SU » » Вопросы новичков » Не все ли потеряно?

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

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

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

Так что ли?
3. Zeross - 10 Августа, 2014 - 23:02:44 - перейти к сообщению
Мелкий пишет:
Напишите свой вариант, так будет более предметно, всё потеряно или ещё нет.

Свой 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.

ну в принципе мой алгоритм был на верном пути, а вот код хз как написать)))))
4. OrmaJever - 10 Августа, 2014 - 23:14:14 - перейти к сообщению
Мелкий пишет:
foreach ($rgInput as $null) {

Что за хипстерство, какой foreach? Подмигивание
5. Zeross - 10 Августа, 2014 - 23:19:18 - перейти к сообщению
OrmaJever пишет:
Мелкий пишет:
foreach ($rgInput as $null) {

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


Оууу ребят тут тема не о том как написать функцию count, а о том что делать если совсем не получилось? не все ли потеряно если не получилось написать такой простой код? Говорю сразу практики нет совсем) только повторял за видео курсом)
6. Мелкий - 10 Августа, 2014 - 23:23:49 - перейти к сообщению
OrmaJever пишет:
Что за хипстерство, какой foreach?

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

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

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

Потому и не получается.
Пишите. Пишите что-нибудь.
Могу сказать, что в начале и меня ставили в тупик простейшие задачи. Вроде понятно, что надо написать, а вот как?..
7. Vinyl - 11 Августа, 2014 - 12:20:48 - перейти к сообщению
Мелкий, драсьте. А второй аргумент забыли? ))

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. Все верно. Мы молодцы)
8. Мелкий - 11 Августа, 2014 - 12:29:45 - перейти к сообщению

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

Честно говоря, да. Улыбка
9. Vinyl - 11 Августа, 2014 - 12:34:26 - перейти к сообщению

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

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


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



А в объекте не встроенный ли count() используется, который нам переписать задали?
10. OrmaJever - 11 Августа, 2014 - 12:56:54 - перейти к сообщению
для численного массива достаточно обычного 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 которое и содержит количество элементов массива.
Спойлер (Отобразить)
11. esterio - 11 Августа, 2014 - 13:00:04 - перейти к сообщению

Я даже не знал что count может рекурсивно считать А?!
12. Мелкий - 11 Августа, 2014 - 13:05:06 - перейти к сообщению
Vinyl пишет:
А в объекте не встроенный ли count() используется, который нам переписать задали?

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

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

Не совсем. Тот же array(null); сломает весь мир. Или любой массив с непоследовательным монотонным ключом или начинающийся не с 0.
Current'а тоже мало - цикл прервётся на первом же значении элемента, приводимом к нулю. + reset забыт.
13. Ch_chov - 11 Августа, 2014 - 13:05:59 - перейти к сообщению
Если реккурсия не нужна, то можно без цикла посчитать:
PHP:
скопировать код в буфер обмена
  1. function myCount($array) {
  2.   return max(array_keys(array_keys($array))) + 1;      
  3. }
14. OrmaJever - 11 Августа, 2014 - 13:19:54 - перейти к сообщению
Мелкий пишет:
Тот же array(null); сломает весь мир.

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

вернёт 2, потому что упёрся в false. Тупиковая ситуация какая-то Улыбка Плохая идея считать элементы Сишной структуры не имея к ней доступа Улыбка
Используя array_keys или подобные встроенные функции мне кажется тоже не очень честно, но с другой стороны по другому не как Растерялся
15. Vinyl - 11 Августа, 2014 - 13:25:34 - перейти к сообщению
Автор, отреагируйте как-нибудь. Что непонятно? )

 

Powered by ExBB FM 1.0 RC1