2 Stimmen

Zurücksetzen des internen Zeigerwerts eines PHP-Arrays (ArrayObject)

Betrachten Sie ein einfaches PHP ArrayObject mit zwei Elementen.

$ao = new ArrayObject();
$ao[] = 'a1';  // [0] => a1
$ao[] = 'a2';  // [1] => a2

Löschen Sie dann den letzten Eintrag und fügen Sie einen neuen Eintrag hinzu.

$ao->offsetUnset(1);
$ao[] = 'a3';  // [2] => a3

Ich würde es sehr begrüßen, wenn 'a3' [1] sein könnte.

Wie kann ich den internen Zeigerwert zurücksetzen? antes de Ich füge 'a3' hinzu?

Ich habe eine einfache Funktion, die dies tut, aber ich würde lieber nicht kopieren Sie das Array, wenn ich nicht zu haben.

function array_collapse($array) {
    $return = array();
    while ($a = current($array)) {
        $return[] = $a;
        next($array);
    }
    return $return;
}

2voto

Wrikken Punkte 66796

Mit der Erweiterung auf die Frage in Ihren Kommentaren: Sie müssten die ArrayObject-Klasse erweitern, um diese Art von Verhalten zu erhalten:

class ReindexingArray extends ArrayObject {
    function offsetUnset($offset){
        parent::offsetUnset($offset);
        $this->exchangeArray(array_values($this->getArrayCopy()));
    }
    //repeat for every other function altering the values.
}

Eine andere Möglichkeit wäre die SplDoublyLinkedList:

<?php
$u = new SplDoublyLinkedList();
$array = array('1' => 'one',
               '2' => 'two',
               '3' => 'three');
foreach($array as $value) $u[] = $value;
var_dump($u);
unset($u[1]);        
var_dump($u);
$u[] = 'another thing';
var_dump($u);

0voto

smoak Punkte 13826

Warum nicht offsetSet :

$ao = new ArrayObject();
$ao[] = 'a1';  // [0] => a1
$ao[] = 'a2';  // [1] => a2
$ao->offsetUnset(1);
$ao->offsetSet(1, 'a3');

0voto

Matthew Purdon Punkte 717

Dies ist etwas lahm, aber Sie können es in ein Standard-Array umwandeln und array_splice darauf anwenden:

$ao = new ArrayObject();
$ao[] = 'element 1';
$ao[] = 'element 2';
$ao[] = 'element 3';
$ao[] = 'element 4';

var_dump($ao);

$items = (array) $ao;
array_splice($items, 1, 2);
$ao = new ArrayObject($items);
$ao[] = 'element 5';

var_dump($ao);

Dies führt zu:

object(ArrayObject)#1 (1) {
  ["storage":"ArrayObject":private]=>
  array(4) {
    [0]=>
    string(9) "element 1"
    [1]=>
    string(9) "element 2"
    [2]=>
    string(9) "element 3"
    [3]=>
    string(9) "element 4"
  }
}
object(ArrayObject)#2 (1) {
  ["storage":"ArrayObject":private]=>
  array(3) {
    [0]=>
    string(9) "element 1"
    [1]=>
    string(9) "element 4"
    [2]=>
    string(9) "element 5"
  }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X