/// <summary> /// Returns array which elements are taken from a specified one in reversed order. /// </summary> /// <param name="array">The array to be reversed.</param> /// <param name="preserveKeys">Whether keys should be left untouched. /// If set to <b>false</b> then integer keys are reindexed starting from zero.</param> /// <returns>The array <paramref name="array"/> with items in reversed order.</returns> public static PhpArray array_reverse(PhpArray array, bool preserveKeys = false) { if (array == null) { //PhpException.ReferenceNull("array"); //return null; throw new ArgumentNullException(); } PhpArray result = new PhpArray(); var e = array.GetFastEnumerator(); if (preserveKeys) { // changes only the order of elements: while (e.MoveNext()) { result.Prepend(e.CurrentKey, e.CurrentValue); } } else { // changes the order of elements and reindexes integer keys: int i = array.IntegerCount; while (e.MoveNext()) { var key = e.CurrentKey; result.Prepend(key.IsString ? key : new IntStringKey(--i), e.CurrentValue); } } // if called by PHP languge then all items in the result should be inplace deeply copied: //result.InplaceCopyOnReturn = true; return result; }
/// <summary> /// Inserts specified items before the first item of an array and reindex integer keys starting from zero. /// </summary> /// <param name="array">The array to be unshifted.</param> /// <param name="vars">Variables to be inserted.</param> /// <returns>The number of items in resulting array.</returns> public static int array_unshift(PhpArray array, params PhpValue[] vars) { if (array == null) { //PhpException.ReferenceNull("array"); //return 0; throw new ArgumentNullException(); } // reindexes integer keys starting from the number of items to be prepended: array.ReindexIntegers(vars.Length); // prepends items indexing keys from 0 to the number of items - 1: for (int i = vars.Length - 1; i >= 0; i--) { array.Prepend(i, vars[i]); } return array.Count; }