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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: array
8Apollon8
Отправлено: 05 Февраля, 2015 - 19:58:29
Post Id


Новичок


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


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




Всем привет! Я новичок в PHP и занимаюсь тем, что ломаю себе голову простыми задачками.
Вот одна из них:
Имеется массив $array = array('Иванов' => 15, 'Петорв' => 40, 'Сидоров' => 50, 'Пупкин' =>
18, 'Попов' => 51, 'Орлов' => 38, 'Карпов' => 35);
Необходимо сделать сортировку по значениям и вывести ключи в список:
Возрастная группа до 20: Иванов Пупкин
Возрастная группа до 45: Петорв Орлов Карпов
Возрастная группа от 50: Сидоров Попов
Решил задачу так:
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. $array = array('Иванов' => 15, 'Петорв' => 40, 'Сидоров' => 50, 'Пупкин' =>
  4.         18, 'Попов' => 51, 'Орлов' => 38, 'Карпов' => 35);
  5.  
  6.         foreach($array as $keyAge => $valAge){
  7.                 if ($valAge <= 20) {
  8.                         $age[0][$keyAge] = $valAge;
  9.                 }
  10.                 elseif ($valAge > 20 and $valAge < 45) {
  11.                         $age[1][$keyAge] = $valAge;
  12.                 }
  13.                 else
  14.                         $age[2][$keyAge] = $valAge;
  15.         }
  16.  
  17. function age20()
  18. {
  19.         global $age;
  20.         foreach ($age[0] as $key => $value) {
  21.                 echo $key."\n";
  22.         }
  23. }
  24. function age45()
  25. {
  26.         global $age;
  27.         foreach ($age[1] as $key => $value) {
  28.                 echo $key."\n";
  29.         }
  30. }
  31. function age50()
  32. {
  33.         global $age;
  34.         foreach ($age[2] as $key => $value) {
  35.                 echo $key."\n";
  36.         }
  37. }
  38.  
  39. echo "Возрастная группа до 20: ",age20();
  40. echo "<br>Возрастная группа до 45: ",age45();
  41. echo "<br>Возрастная группа от 50: ",age50();
  42.  

Вопрос.
Возможно ли написать менее грамоздкий код без применения такого количества функций?
Если да, то могли бы вы привести пример?
 
 Top
Tyoma5891
Отправлено: 05 Февраля, 2015 - 20:29:08
Post Id


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


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


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




делать все в одном цикле сразу за одни проход по массиву... короче в любом случае уже врятли будет)
 
 Top
DelphinPRO
Отправлено: 05 Февраля, 2015 - 20:39:19
Post Id



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


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


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




отсортировать с помощью usort
вывести одним циклом.
без всяких ваших age* функций

(Отредактировано автором: 05 Февраля, 2015 - 20:40:11)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
8Apollon8
Отправлено: 05 Февраля, 2015 - 20:59:14
Post Id


Новичок


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


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




DelphinPRO пишет:
отсортировать с помощью usort
вывести одним циклом.
без всяких ваших age* функций

С помощью usort я отсортирую массив в порядке возрастания, а нужно разбить по группам.
"Вывести одним циклом"
Конечно я могу так сделать. Но тогда получится что-то типа:
Возрастная группа до 20: Иванов
Возрастная группа до 45: Петорв
Возрастная группа от 50: Сидоров
Возрастная группа до 20: Пупкин
Возрастная группа от 50: Попов
и т.д.
А нужно вывести в таком формате:
Возрастная группа до 20: Иванов Пупкин
Возрастная группа до 45: Петорв Орлов Карпов
Возрастная группа от 50: Сидоров Попов
(Добавление)
Оказалось все просто:
PHP:
скопировать код в буфер обмена
  1.  
  2. $array = array('Иванов' => 15, 'Петорв' => 40, 'Сидоров' => 50, 'Пупкин' =>
  3.         18, 'Попов' => 51, 'Орлов' => 38, 'Карпов' => 35);
  4.  
  5.         foreach($array as $keyAge => $valAge){
  6.                 if ($valAge <= 20) {
  7.                         $age[0][$keyAge] = $valAge;
  8.                 }
  9.                 elseif ($valAge > 20 and $valAge < 45) {
  10.                         $age[1][$keyAge] = $valAge;
  11.                 }
  12.                 else
  13.                         $age[2][$keyAge] = $valAge;
  14.         }
  15.  
  16. function age($i_)// "Возрастная группа до 20: ",age(0);
  17. {
  18.         global $age;
  19.         foreach ($age[$i_] as $key => $value) {
  20.                 echo $key;
  21.         }
  22. }
  23.  
  24. echo "Возрастная группа до 20: ",age(0);
  25. echo "<br>Возрастная группа до 45: ",age(1);
  26. echo "<br>Возрастная группа от 50: ",age(2);
  27.  
 
 Top
Tyoma5891
Отправлено: 05 Февраля, 2015 - 21:11:53
Post Id


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


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


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




8Apollon8 пишет:
DelphinPRO пишет:
отсортировать с помощью usort
вывести одним циклом.
без всяких ваших age* функций

С помощью usort я отсортирую массив в порядке возрастания, а нужно разбить по группам.
"Вывести одним циклом"
Конечно я могу так сделать. Но тогда получится что-то типа:
Возрастная группа до 20: Иванов
Возрастная группа до 45: Петорв
Возрастная группа от 50: Сидоров
Возрастная группа до 20: Пупкин
Возрастная группа от 50: Попов
и т.д.
А нужно вывести в таком формате:
Возрастная группа до 20: Иванов Пупкин
Возрастная группа до 45: Петорв Орлов Карпов
Возрастная группа от 50: Сидоров Попов


Вы видите что писал Вам?=)
PHP:
скопировать код в буфер обмена
  1.  
  2. $do20 = "Ворастная до 20";
  3. $do45 = "Ворастная до 45";
  4. $ot50 = "Ворастная до 20";
  5. foreach ($array as $k=>$v)
  6. {
  7.       if ($v<20)
  8.       {
  9.              $do20 .= $k;
  10.       }
  11.       if ($v<45)
  12.       {
  13.              $do45 .= $k;
  14.       }
  15.       if ($v>50)
  16.       {
  17.              $ot50 .= $k;
  18.       }
  19. }
  20. echo $do20.$do45.$ot50;
  21.  

вот так примерно с раздлениями полей не наводил красоту но суть такая
 
 Top
8Apollon8
Отправлено: 05 Февраля, 2015 - 21:19:59
Post Id


Новичок


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


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




Спасибо! Все еще проще чем я думал )
(Добавление)
8Apollon8 пишет:
Спасибо! Все еще проще чем я думал )

Но почему-то вышло так:
Ворастная до 20ИвановПупкин
Ворастная до 45ИвановПеторвПупкинОрловКарпов
Ворастная до 50СидоровПопов
А ведь Иванову с Пупкиным и 20 нет )))
 
 Top
Sail
Отправлено: 06 Февраля, 2015 - 08:05:36
Post Id



Участник


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


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




8Apollon8 пишет:
А ведь Иванову с Пупкиным и 20 нет )))

Группы ведь "до X", а не "от Y до X". Ну и "от MAX" Улыбка
В общем, используйте if() {} elseif() {} else {}
 
 Top
8Apollon8
Отправлено: 06 Февраля, 2015 - 10:00:41
Post Id


Новичок


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


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




Sail пишет:
8Apollon8 пишет:
А ведь Иванову с Пупкиным и 20 нет )))

Группы ведь "до X", а не "от Y до X". Ну и "от MAX" Улыбка
В общем, используйте if() {} elseif() {} else {}

Я так и делал. Просто пропарился с тремя функциями. Можно было обойтись одной
PHP:
скопировать код в буфер обмена
  1.  
  2. function age($i_)// "Возрастная группа до 20: ",age(0);
  3. {
  4.         global $age;
  5.         foreach ($age[$i_] as $key => $value) {
  6.                 echo $key;
  7.         }
  8. }
  9.  

Как я показал выше.
А вот еще способ, который мне показал пользователь "hrushachka"
PHP:
скопировать код в буфер обмена
  1.  
  2. $array = array('Иванов' => 15, 'Петров' => 40, 'Сидоров' => 50, 'Пупкин' =>
  3.         18, 'Попов' => 51, 'Орлов' => 38, 'Карпов' => 35);
  4. asort($array);
  5. echo "Возрастная группа до 20: ";
  6. $CASE=1;
  7. foreach ($array as $key=>$value)
  8. switch (true)
  9. {
  10. case($value < 20):
  11. echo " $key";
  12. break;
  13. case ($value >=20 and $value <45):
  14. if ($CASE===1)
  15.         {
  16.         echo "<br>Возрастная группа до 45:";
  17.         $CASE=2;
  18.         }
  19. echo " $key";
  20. break;
  21. case ($value >=45):
  22. if ($CASE===2)
  23.         {
  24.         echo "<br>Возрастная группа от 50:";
  25.         $CASE=3;
  26.         }
  27. echo " $key";
  28. }
  29.  

(Добавление)
Sail пишет:
8Apollon8 пишет:
А ведь Иванову с Пупкиным и 20 нет )))

Группы ведь "до X", а не "от Y до X". Ну и "от MAX" Улыбка
В общем, используйте if() {} elseif() {} else {}

Ну да не обратил внимание на условие
 
 Top
8Apollon8
Отправлено: 06 Февраля, 2015 - 17:40:59
Post Id


Новичок


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


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




А вот есшо:
PHP:
скопировать код в буфер обмена
  1.  
  2. $array = array('Иванов' => 15, 'Петорв' => 40, 'Сидоров' => 50, 'Пупкин' =>
  3.         18, 'Попов' => 51, 'Орлов' => 38, 'Карпов' => 35);
  4.  
  5.  
  6. foreach($array as $keyAge => $valAge){
  7.                 if ($valAge <= 20) {
  8.                         $age[0][$keyAge] = $valAge;
  9.                         $age1 = implode(", ", array_flip($age[0]));
  10.                 }
  11.                 elseif ($valAge > 20 and $valAge < 45) {
  12.                         $age[1][$keyAge] = $valAge;
  13.                         $age2 = implode(", ", array_flip($age[1]));
  14.                 }
  15.                 else{
  16.                         $age[2][$keyAge] = $valAge;
  17.                         $age3 = implode(", ", array_flip($age[2]));
  18.                 }
  19.         }
  20.  
  21. echo "Возрастная группа до 20: $age1";
  22. echo "<br>Возрастная группа до 45: $age2";
  23. echo "<br>Возрастная группа от 45: $age3";
  24.  
  25.  
 
 Top
hrushachka
Отправлено: 06 Февраля, 2015 - 22:40:41
Post Id


Новичок


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


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




Ух стока вариантов, решай следующую задачу!Например:Задание: описать функцию используя "однопроходный алгоритм"(алгоритм, позволяющий получить требуемый результат после однократного просмотра набора исходных данных).
Есть одномерный массив, каждый элемент содержит числовую величину.
Найти среднее значение этой величины, не учитывая минимальные и максимальные значения.

Товарищи я тут 2+2 сложить хочу, подскажите какой самый правильный способ! Я новичек!
СтарожилСергей: все просто, ответ 4!!!
Вася: Воспользуйся калькулятором!
Марь Ивановна:Пусть Х=2, У=2, откуда Х+У=4, проверка 2+2=4
<ПогроммистPHP2015TuRbO> : Function Slojenie2plus2($A,$B){< Хитрый код>}
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB