За последние 24 часа нас посетили 15993 программиста и 1726 роботов. Сейчас ищут 1783 программиста ...

Поиск нулевого элемента в массиве

Тема в разделе "PHP для новичков", создана пользователем Алексей Муратов, 14 окт 2007.

  1. Алексей Муратов

    Алексей Муратов Активный пользователь

    С нами с:
    9 апр 2007
    Сообщения:
    17
    Симпатии:
    0
    Есть массив ответов, в котором индекс число (номер задачи, идут не по порядку, но возрастают), а значение строка (ответ задачи). Массив записывается в базу в виде строки. Задача найти следующий нулевой элемент, чтобы вывести на экран соответствующую задачу. Написал функцию, при проверке выясняется что она находит первый нулевой элемент, а не слудующий после заданного. Получается что во втором foreach $task_id > $id хотя это одно и тоже число. Не пойму где ошибка. Подскажите.

    function test_next($id=0)
    {
    $err = -1;
    $this->sql_query = "select e_result from tbl_test where e_id_user = '".$this->test_user_id()."'";
    $this->sql_execute();
    list($temp) = mysql_fetch_row($this->sql_res);

    $arr = unserialize($temp);

    // ищем первый нулевой элемент
    foreach($arr as $task_id => $task_solv)
    {
    if($task_solv == "")
    {
    $this->out_task_id = $task_id;
    $err = $task_solv;
    break;
    }
    }

    // ищем нулевой элемент после заданного
    foreach($arr as $task_id => $task_solv)
    {
    if($task_id > $id && $task_solv == "")
    {
    echo $task_id." e";
    $this->out_task_id = $task_id;
    $err = $task_id;
    break;
    }
    }

    $this->out_task();

    return($err);
    }
     
  2. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    интересно, это я один ничего не понял?
     
  3. Anonymous

    Anonymous Guest

    нет, ты не один такой...
     
  4. Алексей Муратов

    Алексей Муратов Активный пользователь

    С нами с:
    9 апр 2007
    Сообщения:
    17
    Симпатии:
    0
    Попробую еще раз. :?
    Есть массив A
    i - целое число (int)
    значение - строка

    Нужно найти нулевой элемент после заданного, если такого нет, то первый нулевый элемент. Идея чтобы показывать значения массива по кругу.
    Пример:
    1)
    A[11] = ""
    A[13] = "as"
    A[14] = ""
    A[15] = "q"

    func(13) должен вернуть 14

    2)
    A[11] = ""
    A[13] = "as"
    A[14] = "d"
    A[15] = "q"

    func(13) должен вернуть 11

    Я начал делать следующим образом. Нахожу первый нулевой элемент. Дальше ищу элемент у которого индекс больше заданного и нулевое значение, если он есть возвращаю его, если нет, то первый найденный. Если пустых нет то -1.
    Так вот функция в первом посте работет не правильно.
    A[11] = "в"
    A[13] = ""
    A[14] = ""
    A[15] = "q"
    func(13) возвращает 13, а надо что бы было 14
     
  5. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Код (Text):
    1. function func($n){
    2.     $arr = array(
    3.         // сам массив
    4.     );
    5.  
    6.     foreach ($arr as $k => $v)
    7.         if (!$v and ($k > $n or $k >= $n))
    8.             return $k;
    9.     return -1;
    10. }
    Работает?
     
  6. Алексей Муратов

    Алексей Муратов Активный пользователь

    С нами с:
    9 апр 2007
    Сообщения:
    17
    Симпатии:
    0
    Спасибо, вечером проверю. Сейчас негде.
     
  7. redmi

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

    С нами с:
    10 окт 2007
    Сообщения:
    12
    Симпатии:
    0
    Код (Text):
    1. function func($n){
    2.  
    3.   $arr[11] = "b";
    4.   $arr[13] = "";
    5.   $arr[14] = "";
    6.   $arr[15] = "q";
    7.  
    8.   foreach ($arr as $k => $v) {
    9.     if (! $v) {
    10.       if ($k > $n) {
    11.         return $k;
    12.       } else {  
    13.         if (! isset($m))
    14.         $m = $k;
    15.       }
    16.     }  
    17.   }  
    18.   if (isset($m)) {
    19.     return $m;
    20.   } else {
    21.     return -1;
    22.   }    
    23. }
    24.  
    25.  
    26. echo func(13);
     
  8. redmi

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

    С нами с:
    10 окт 2007
    Сообщения:
    12
    Симпатии:
    0
    Вроде работает..
    Код (Text):
    1. function test_next($id=0) {
    2.   $err = -1;
    3.   //$this->sql_query = "select e_result from tbl_test where e_id_user = '".$this->test_user_id()."'";
    4.   //$this->sql_execute();
    5.   //list($temp) = mysql_fetch_row($this->sql_res);
    6.  
    7.   //$arr = unserialize($temp);  
    8.  
    9.   $arr[11] = "b";
    10.   $arr[13] = "";
    11.   $arr[14] = "";
    12.   $arr[15] = "q";
    13.  
    14.   // ищем первый нулевой элемент
    15.   foreach($arr as $task_id => $task_solv) {
    16.     if($task_solv == "") {
    17.       //$this->out_task_id = $task_id;
    18.       // Исправлено $task_solv -> $task_id
    19.       $err = $task_id;
    20.       break;
    21.     }
    22.   }
    23.  
    24.   // ищем нулевой элемент после заданного
    25.   foreach($arr as $task_id => $task_solv) {
    26.     if($task_id > $id && $task_solv == "") {
    27.       //echo $task_id." e";
    28.       //$this->out_task_id = $task_id;
    29.       $err = $task_id;
    30.       break;
    31.     }
    32.   }
    33.  
    34.   //$this->out_task();
    35.   return($err);
    36. }
    37.  
    38. echo test_next(13);