За последние 24 часа нас посетили 23440 программистов и 1725 роботов. Сейчас ищут 917 программистов ...

Минимальный элемент с пропуском нулей

Тема в разделе "PHP для новичков", создана пользователем mattxs, 20 апр 2015.

  1. mattxs

    mattxs Новичок

    С нами с:
    8 мар 2015
    Сообщения:
    13
    Симпатии:
    0
    Добрый день, дорогие формучане!
    Запустался в самом простом. Необходимо написать функцию поиска минимального элемента в двумерном массиве, при этом пропускать нули, если они имеются.

    Вот, что я написал:
    Код (PHP):
    1. $ab = array(
    2.             array(5,0,0),
    3.             array(0,4,0),
    4.             array(0,2,0)
    5.         );
    6. function MinElemTarif($arr)
    7.     {
    8.         $min = $arr[0][0];
    9.         
    10.         for ($i=0; $i < count($arr); $i++)
    11.             {
    12.                 for ($j=0; $j < count($arr[0]); $j++)
    13.                     {
    14.                         if($arr[$i][$j]==0) continue;
    15.  
    16.                         if($min>$arr[$i][$j]) $min=$arr[$i][$j];
    17.                     }
    18.             }
    19.         return $min;
    20.     }
    Она работает, отлично и пропускает нули, но до тех пор, пока я не задам первый элемент равный 0, т.е.
    Код (PHP):
    1. $ab = array(
    2.             array(0,0,0),
    3.             array(0,4,0),
    4.             array(0,2,0)
    5.         );
    Тогда он пишет, что минимум 0,не пропуская его.
    Помогите, пожалуйста, разобраться. Заранее спасибо!
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Код (PHP):
    1.     if($min>$arr[$i][$j] || $min == 0 && $arr[$i][$j] != 0) $min=$arr[$i][$j];
    2.  
    Остаётся случай, когда одни нули. Ну тогда вы просто проверяете, если результат 0, значит в массиве были одни нули
     
  3. mattxs

    mattxs Новичок

    С нами с:
    8 мар 2015
    Сообщения:
    13
    Симпатии:
    0
    Спасибо, большое!
     
  4. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    можно еще так извратиться)
    Код (PHP):
    1. function MinElemTarif($a) {
    2.   static $m = null;
    3.   is_array($a) ? array_map(__FUNCTION__,$a) : ( $a>0 ? $m=( !$m $a : min($m,$a) ) : 0 );
    4.   return $m;
    5. } 
     
  5. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    for, __FUNCTION__ ... извращенцы. :)

    Код (Text):
    1. function array2_min(array $ab) {
    2.     $min = PHP_INT_MAX;
    3.     foreach($ab as $a) {
    4.         foreach($a as $v) {
    5.             if($v != 0 and $v < $min) {
    6.                 $min = $v;
    7.             }
    8.         }
    9.     }
    10.     return $min;
    11. }
    п.с. По хорошему, ещё бы нужна "защита от дурака".
     
  6. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ты тему читал? ТСу нужно найти минимальное, а нули вообще игнорить.
    твоя функция имеет туже проблему что и у ТСа)

    Добавлено спустя 2 минуты 45 секунд:
    исправил уже)
    тока зачем вообще брать первый элемент вручную. если в цикле мы все равно будем его опять обрабатывать?)
    не проще ли в $min положить null. а инициализировать уже внутри первым ненулевым элементом.
     
  7. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Вероятно может быть длинный цикл. Поэтому чем меньше условий, тем лучше.