Покинул форум
Сообщений всего: 53
Дата рег-ции: Авг. 2014
Помог: 0 раз(а)
Здравствуйте, я хотел бы узнать вот какой момент, обучаюсь по курсу "Специалист". Вот там в одном из курсов он дал задание описать встроенную функцию "count". То есть представить как будто её ещё нету в php, дал задание написать такую функцию самостоятельно! Так вот фишка в том что я даже приблизительно не смог её написать, я вообще думал что нужно делать её с помощью цикла, меньше число чем в массиве? значить ++))))) Но посмотрев курс дальше и посмотрев код препода, он сначала проверял тип через if и бла бла бла! кароч сделал то, что я даже не подозревал что нужно так. Вот я че хотел узнать не все ли у меня потеряно? так как меня этот момент очень насторожил! Заранее благодарен за ответы!
Мелкий
Отправлено: 10 Августа, 2014 - 22:52:05
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Напишите свой вариант, так будет более предметно, всё потеряно или ещё нет.
Ну да, что то типа такого пытался сделать, только через While))) мб я не знаю где и какую функцию лучше использовать? например хз где лучше while а где foreach.
ну в принципе мой алгоритм был на верном пути, а вот код хз как написать)))))
OrmaJever
Отправлено: 10 Августа, 2014 - 23:14:14
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Мелкий пишет:
foreach ($rgInput as $null) {
Что за хипстерство, какой foreach?
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Zeross
Отправлено: 10 Августа, 2014 - 23:19:18
Новичок
Покинул форум
Сообщений всего: 53
Дата рег-ции: Авг. 2014
Помог: 0 раз(а)
OrmaJever пишет:
Мелкий пишет:
foreach ($rgInput as $null) {
Что за хипстерство, какой foreach?
Оууу ребят тут тема не о том как написать функцию count, а о том что делать если совсем не получилось? не все ли потеряно если не получилось написать такой простой код? Говорю сразу практики нет совсем) только повторял за видео курсом)
Мелкий
Отправлено: 10 Августа, 2014 - 23:23:49
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Оууу ребят тут тема не о том как написать функцию count
Дайте поразвлекаться чуток (Добавление)
Zeross пишет:
практики нет совсем)
Потому и не получается.
Пишите. Пишите что-нибудь.
Могу сказать, что в начале и меня ставили в тупик простейшие задачи. Вроде понятно, что надо написать, а вот как?..
----- PostgreSQL DBA
Vinyl
Отправлено: 11 Августа, 2014 - 12:20:48
Частый посетитель
Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012 Откуда: Армавир, Краснодарский край
1) Объявляем функцию. Указываем, какие аргументы нам нужны. В нашем случае аргумент $rgInput (сам массив, в котором нужно посчитать кол-во элементов) и необязательный аргумент $rec, который дает возможность посчитать все элементы многомерного массива. Если в списке аргументов присутствует оператор присваивания ($rec = false), это и означает, что параметр не обязательный.
3) Объявляем переменную, которая послужит нам счетчиком, и занесем в нее ноль. Мы же еще ничего не подсчитали, так?
5) В цикле перебираем элементы массива по одному (в одном уровне).
8) Проверяем, нужно ли считать уровни ниже. Если нужно, то проверяем, является ли текущий элемент массива массивом (масло масляное)) ).
Если да, то 11) Вызываем эту же функцию внутри нее самой (рекурсия). Она делает свои дела, и возвращает нам количество элементов уровнями ниже. Прибавляем число, возвращенное нашей ф-ей к нашему счетчику.
15) Прибавляем к нашему счетчику единицу. Это же тоже элемент массива, верно?
19) Возвращаем наш счетчик.
Проверяем. Заполним белибердой многомерный массив (22 - 26).
Вызываем нашу ф-ю, в которую передаем только первый аргумент - наш массив (28). Получаем 5. Все верно.
Вызываем нашу ф-ю, в которую передаем наш массив и второй аргумент, который подсчитает все элементы многомерного массива. Получаем 8. Все верно. Мы молодцы)
Bucket *pInternalPointer;/* Used for element traversal */
Bucket *pListHead;
Bucket *pListTail;
Bucket **arBuckets;
dtor_func_t pDestructor;
zend_bool persistent;
unsigned char nApplyCount;
zend_bool bApplyProtection;
#if ZEND_DEBUG
int inconsistent;
#endif
} HashTable;
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
esterio
Отправлено: 11 Августа, 2014 - 13:00:04
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
Я даже не знал что count может рекурсивно считать
Мелкий
Отправлено: 11 Августа, 2014 - 13:05:06
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Vinyl пишет:
А в объекте не встроенный ли count() используется, который нам переписать задали?
Задали реализовать встроенную функцию count. А это - метод встроенного класса, а не функция! Головология чистого вида.
OrmaJever пишет:
для численного массива достаточно обычного for или while
Не совсем. Тот же array(null); сломает весь мир. Или любой массив с непоследовательным монотонным ключом или начинающийся не с 0.
Current'а тоже мало - цикл прервётся на первом же значении элемента, приводимом к нулю. + reset забыт.
----- PostgreSQL DBA
Ch_chov
Отправлено: 11 Августа, 2014 - 13:05:59
Постоянный участник
Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008 Откуда: из города
Помог: 90 раз(а)
Если реккурсия не нужна, то можно без цикла посчитать:
вернёт 2, потому что упёрся в false. Тупиковая ситуация какая-то Плохая идея считать элементы Сишной структуры не имея к ней доступа
Используя array_keys или подобные встроенные функции мне кажется тоже не очень честно, но с другой стороны по другому не как
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Vinyl
Отправлено: 11 Августа, 2014 - 13:25:34
Частый посетитель
Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012 Откуда: Армавир, Краснодарский край
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.