PHP как array_unshift для arrayObject - PullRequest
4 голосов
/ 29 июля 2011

Как указано в заголовке, как вы выполняете array_unshift() на arrayObject, array_push() получается с помощью arrayObject->append(), но как насчет unshift?

Редактировать: Что я 'я забыл упомянуть, что в этом конкретном случае мне также нужно сохранить существующие ключи.

Ответы [ 4 ]

7 голосов
/ 29 июля 2011

API ArrayObject не имеет никакой функции для непосредственного выполнения этого.У вас есть несколько других вариантов:

  • Вручную переместите каждый элемент на 1 и установите новое значение на индекс 0 (только если у вас есть числовой индекс ArrayObject).
 $tmp = NULL;
 for ($i = 0; $arrayObject->offsetExists($i + 1); $i++) {
      $tmp = $arrayObject->offsetGet($i + 1);
      $arrayObject->offsetSet($i + 1, $arrayObject->offsetGet($i));
 }
 $arrayObject->offsetSet($i, $tmp);
 $arrayObject->offsetSet(0, $new_value);
  • Напишите класс, производный от ArrayObject и добавьте функцию prepend (реализация может быть приведена ниже).
  • Извлеките массив, вызовите array_unshift() и создайте новый ArrayObject с измененным массивом:
 $array = $arrayObject->getArrayCopy();
 array_unshift($array, $new_value);
 $arrayObject->exchangeArray($array);
4 голосов
/ 29 июля 2011

В ArrayObject такой функции нет, но вы можете создать подкласс для добавления того, что вам нужно. Попробуйте это:

class ExtendedArrayObject extends ArrayObject {
    public function prepend($value) {
        $array = (array)$this;
        array_unshift($array, $value);
        $this->exchangeArray($array);
    }
}
2 голосов
/ 16 июня 2013
function prefix($value) {
    return $this->exchangeArray(array_merge([$value], $this->getArrayCopy()));
}
1 голос
/ 29 июля 2011

@ Дмитрий, @soulmerge ваши ответы были хорошими в отношении первоначального вопроса, но при моем редактировании не хватало требования, но они указывают мне верное направление, чтобы достичь того, чего я ожидал, вот решение, с которым мы пришли сюда на работе :( работа для php> = 5.1)

public function unshift($value){
  $tmp = $this->getArrayCopy();
  $tmp = array($value) + $tmp;
  $this->exchangeArray($tmp);
  return $this;
}

эти примеры не совсем совпадают с окончательным решением, которое нам нужно, как для нашего конкретного объекта arrayObject. Мы используем данный ключ в значениях массива в качестве ключа для значений (представьте себе, что в качестве индекса каждого значения в коллекции используется rowId базы данных). давайте назовем это значение ключом, вот как выглядит структура массива:

array(
  key1 => array(key=>key1,val1=>val1,val2=>val2...),
  key2 => array(key=>key2,val1=>val1_2,val2=>val2_2...),
  ...
);

так что наше решение выглядит примерно так:

public function unshift($value){
  $tmp = $this->getArrayCopy();
  $tmp = array($value['key'],$value) + $tmp;
  $this->exchangeArray($tmp);
  return $this;
}

спасибо за ваши ответы, если вы найдете способ, который работает в php5.0, я все еще заинтересован.

...