بالتكرار عبر مجموعة عضوا مع IteratorAggregate

StackOverflow https://stackoverflow.com/questions/331376

  •  11-07-2019
  •  | 
  •  

سؤال

ولدي فئة وأريد أن أكون قادرة على تكرار عبر عضو صفيف معينة. لقد فعلت ذلك لبحث سريع وجدت IteratorAggregate:

class foo implements IteratorAggregate
{
    protected $_array = array('foo'=>'bar', 'baz'=>'quux');

    public function getIterator()
    {
        return new ArrayIterator($this->_array);
    }
}

والذي يعمل كبيرة، ولكن لا أن إنشاء مثيل ArrayIterator جديد يستخدم في كل مرة foreach على ذلك؟

وحتى ظننت أنني يجب تخزين المثال مكرر في عضو:

    protected $_iterator;

    public function getIterator()
    {
        if (!$this->_iterator instanceof ArrayIterator) {
            $this->_iterator = new ArrayIterator($this->_array);
        }
        return $this->_iterator;
    }

والمشكلة هي أن يستخدم مكرر نسخة من $this->_array أثناء المكالمة الأولى من getIterator()، حتى لا تنعكس التغييرات إلى عضو في بنيات foreach اللاحقة.

وكنت أفكر أنني يجب أن فئة فرعية ArrayIterator، إضافة أسلوب setArray($array) والذي يطلق عليه قبل إعادته في getIterator()، ولكن أنا لا أعرف اسم عضو في مجموعة يستخدم داخليا وعما إذا كان أو لم يكن هو overwriteable من فئة فرعية.

والسؤال هو: هل هذا التحسين سابق لأوانه و / أو غير ضرورية؟ إذا لا، ما هي أفضل طريقة لتحقيق ذلك؟

هل كانت مفيدة؟

المحلول

وسوف تفشل رمز الثاني على حلقات متعددة من الجسم حيث تبدأ حلقة جديدة قبل انتهاء آخر.

لا تبدو حقا مثل الأمثل يستحق قضاء الوقت على أي.

نصائح أخرى

<اقتباس فقرة>   

ولكن لا أن إنشاء مثيل ArrayIterator جديد يستخدم كل foreach الوقت على ذلك؟

نعم، و؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top