GetEnumerator() public method

Gets PHP enumerator for this array.
public GetEnumerator ( ) : OrderedDictionary.Enumerator
return OrderedDictionary.Enumerator
コード例 #1
0
ファイル: Arrays.cs プロジェクト: iolevel/peachpie
        /// <summary>
        /// Internal version of <see cref="Chunk"/> with deep-copy option.
        /// </summary>
        internal static PhpArray ChunkInternal(PhpArray array, int size, bool preserveKeys, bool deepCopy)
        {
            if (array == null)
            {
                //PhpException.ArgumentNull("array");
                //return null;
                throw new ArgumentNullException(nameof(array));
            }
            if (size <= 0)
            {
                //PhpException.InvalidArgument("array", LibResources.GetString("arg:negative_or_zero"));
                //return null;
                throw new ArgumentException(nameof(size));
            }

            // nothing to do:
            if (array.Count == 0)
                return new PhpArray();

            // number of chunks:
            int count = (array.Count - 1) / size + 1; // = ceil(Count/size):

            PhpArray chunk;
            PhpArray result = new PhpArray(count, 0);

            IEnumerator<KeyValuePair<IntStringKey, PhpValue>> iterator = array.GetEnumerator();

            // if deep-copies are required, wrapp iterator by enumerator making deep copies:
            if (deepCopy)
                iterator = PhpVariable.EnumerateDeepCopies(iterator);

            iterator.MoveNext();

            // all chunks except for the last one:
            for (int i = 0; i < count - 1; i++)
            {
                chunk = new PhpArray(size, 0);

                if (preserveKeys)
                {
                    for (int j = 0; j < size; j++, iterator.MoveNext())
                        chunk.Add(iterator.Current.Key, iterator.Current.Value);
                }
                else
                {
                    for (int j = 0; j < size; j++, iterator.MoveNext())
                        chunk.Add(iterator.Current.Value);
                }

                result.Add(chunk);
            }

            // the last chunk:
            chunk = new PhpArray((size <= array.Count) ? size : array.Count, 0);

            if (preserveKeys)
            {
                do { chunk.Add(iterator.Current.Key, iterator.Current.Value); } while (iterator.MoveNext());
            }
            else
            {
                do { chunk.Add(iterator.Current.Value); } while (iterator.MoveNext());
            }

            result.Add(chunk);

            // no deep copy is needed since it has already been done on chunks:
            return result;
        }