За последние 24 часа нас посетили 55548 программистов и 1716 роботов. Сейчас ищут 793 программиста ...

Найти свободный индекс в массиве

Тема в разделе "PHP для новичков", создана пользователем pircul, 9 дек 2016.

  1. pircul

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

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    Есть массив максимальное количество элементов которого равно пяти.
    При добавлении элемента нужно определить какой индекс null, и туда добавить новый элемент
    Удаление элементов происходит по индексу
    Если все значения не null(заняты), тогда ничего добавлять не нужно
    Но если элемент удалился (стал null) то этот индекс можно занять при вызове add
    Использование циклов и дополнительных массивов/объектов/файлов запрещено
    Вот базовая реализация. Помогите решить задачу расширив данную реализацию


    Код (Text):
    1. class Arr
    2. {
    3.     private $arr = [null,null,null,null,null];
    4.     private $index = 0;
    5.  
    6.     public function add($element)
    7.     {
    8.         if ($this->index == count($this->arr)) {
    9.             return false;
    10.         }
    11.  
    12.         $this->arr[$this->index] = $element;
    13.         $this->index++;
    14.         return true;
    15.     }
    16.  
    17.     public function del($index)
    18.     {
    19.         if (isset($this->arr[$index])) {
    20.             $this->arr[$index] = null;
    21.             return true;
    22.         }
    23.         return false;
    24.     }
    25.  
    26.     public function get($index)
    27.     {
    28.         if (isset($this->arr[$index])) {
    29.             return $this->arr[$index];
    30.         }
    31.  
    32.         return false;
    33.     }
    34. }
    35.  
    36. $arr = new Arr();
    37. $arr->add(1);
    38. $arr->add(2);
    39. $arr->add(3);
    40. $arr->add(4);
    41. $arr->add(5);
     
    #1 pircul, 9 дек 2016
    Последнее редактирование: 9 дек 2016
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Не индексы как я понял, а значения.
    У вашей реализации кстати циклы используются.
     
  3. pircul

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

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    Да

    Да. Убрал цикл
     
  4. machetero

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

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Код (Text):
    1.  
    2.    public function update($val)
    3.    {
    4.       for($i=0; $i<5; $i++){
    5.          if(is_null($this->arr[$i])){
    6.             $this->arr[$i] = $val;
    7.             break;
    8.          }
    9.       }
    10.    }
     
  5. pircul

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

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    @machetero
    В условиях был отмечен запрет на использование циклов :)
     
  6. machetero

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

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    может это сработает

    $key = array_search(null, $this->arr);
    $this->arr[$key] = $val;
     
  7. pircul

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

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    Спасибо. Но array_search тоже подразумевает проход по массиву, только это скрыто от нас
    --- Добавлено ---
    Все что есть для использования это переменные и различные операторы
     
  8. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    @pircul, используйте рекурсию... если, конечно, это тоже не посчитают скрытым циклом ))

    PHP:
    1. public function add($element)
    2.     {
    3.         if ($this->index == count($this->arr)) {
    4.             return false;
    5.         }
    6.         if(!is_null($this->arr[$this->index])) {
    7.             $this->index++;
    8.             return $this->add($element);
    9.         }
    10.         $this->arr[$this->index] = $element;
    11.         return true;
    12.     }
     
    #8 Deonis, 9 дек 2016
    Последнее редактирование: 9 дек 2016
  9. pircul

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

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Не говнокодим
    PHP:
    1. <?php
    2. class Arr extends ArrayObject {
    3.   public function offsetSet($offset, $value) {
    4.       if (count($this) > 4) {
    5.               return;
    6.       }
    7.       if (is_null($offset)) {
    8.             parent::offsetSet($offset, $value);
    9.         } else {
    10.             parent::offsetSet($offset, $value);;
    11.         }
    12.     }
    13. }
    14.  
    15. $a = new Arr;
    16. $a[] = 'A';
    17. $a[] = 'B';
    18. $a[] = 'C';
    19. $a[] = 'D';
    20. $a[] = 'E';
    21. $a[] = 'F';
    22. print_r($a);
    23.  
    24. unset($a[1]);
    25. $a[] = 'F';
    26. print_r($a);
    Код (Text):
    1. Arr Object
    2. (
    3.     [storage:ArrayObject:private] => Array
    4.         (
    5.             [0] => A
    6.             [1] => B
    7.             [2] => C
    8.             [3] => D
    9.             [4] => E
    10.         )
    11.  
    12. )
    13. Arr Object
    14. (
    15.     [storage:ArrayObject:private] => Array
    16.         (
    17.             [0] => A
    18.             [2] => C
    19.             [3] => D
    20.             [4] => E
    21.             [5] => F
    22.         )
    23.  
    24. )