Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7027541
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 28, 20262026-05-28T00:15:42+00:00 2026-05-28T00:15:42+00:00

I have an SplObjectStorage instance that stores element objects to be rendered in a

  • 0

I have an SplObjectStorage instance that stores element objects to be rendered in a container. I would like the ability to efficiently add and remove objects from any random position in the store.

Example:

<?php
$store = new SplObjectStorageWrapper;
$obj1 = new Obj;
$obj2 = new Obj;
$obj3 = new Obj;

$store->attach($obj1);
$store->attach($obj2);
$store->insertAtIndex($obj3, 1);

//Storage should now be organized as $obj1, $obj3, $obj2

How would I go about implementing the insertAtIndex method? Do I use a LimitIterator to detach and reattach children after a certain position? Using an array-based object storage has proven to be much slower than an SplObjectStorage instance.

Other methods that I would like to implement include removeAtIndex(integer) and indexOf(object)

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-28T00:15:42+00:00Added an answer on May 28, 2026 at 12:15 am

    It turns out the easiest (and apparently most efficient) way to do this is to extend SplObjectStorage and to make use of LimitIterator. Code example below:

    <?php
    /**
     * Extends the SplObjectStorage class to provide index functions
     */
    class ObjectStorage extends SplObjectStorage {
    
        /**
         * Returns the index of a given object, or false if not found
         * @param object $object
         */
        function indexOf($object){
    
            if(!$this->contains($object)) return false;
    
            foreach($this as $index => $obj) if($obj === $object) return $index;
    
        }
    
        /**
         * Returns the object at the given index
         */
        function itemAtIndex($index){
    
            $it = new LimitIterator($this, $index, 1);
            foreach($it as $obj) return $obj;
    
        }
    
        /**
         * Returns the sequence of objects as specified by the offset and length
         * @param int $offset
         * @param int $length
         */
        function slice($offset, $length){
    
            $out = array();
            $it = new LimitIterator($this, $offset, $length);
            foreach($it as $obj) $out[] = $obj;
            return $out;
    
        }
    
        /**
         * Inserts an object (or an array of objects) at a certain point
         * @param mixed $object A single object or an array of objects
         * @param integer $index
         */
        function insertAt($object, $index){
    
            if(!is_array($object)) $object = array($object);
    
            //Check to ensure that objects don't already exist in the collection
            foreach($object as $k => $obj):
                if($this->contains($obj)) unset($object[$k]);
            endforeach;
    
            //Do we have any objects left?
            if(!$object) return;
    
            //Detach any objects at or past this index
            $remaining = array();
            if($index < $this->count()):
                $remaining = $this->slice($index, $this->count() - $index);
                foreach($remaining as $obj) $this->detach($obj);
            endif;
    
            //Add the new objects we're splicing in
            foreach($object as $obj) $this->attach($obj);
    
            //Attach the objects we previously detached
            foreach($remaining as $obj) $this->attach($obj);
    
        }
    
        /**
         * Removes the object at the given index
         * @param integer $index
         */
        function removeAt($index){
    
            $this->detach($this->itemAtIndex($index));
    
        }
    
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Have a script to add / remove options from a select field -- the
I have implemented a simple Composite pattern using SplObjectStorage, like the example above: class
Have a bunch of WCF REST services hosted on Azure that access a SQL
Have a photography site that I want to prevent image copying from. How can
Have a xml string, goal is to replace an xml element value to a
Have advancements in CPU design like dynamic instruction scheduling narrowed the performance gap between
Have some dates in my local Oracle 11g database that are in this format:
Have an app that can use tts to read text messages. It can also
Have a fun issue with sharepoint calendar view filtering. That code works fine: SPSecurity.RunWithElevatedPrivileges(delegate()
Have a large amount of HTML, but where I thought the bottleneck would be

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.