public static PhpArray array_slice(PhpArray array, int offset, int length = int.MaxValue, bool preserveKeys = false)
{
if (array == null)
{
//PhpException.ArgumentNull("array");
//return null;
throw new ArgumentNullException();
}
// absolutizes range:
PhpMath.AbsolutizeRange(ref offset, ref length, array.Count);
var iterator = array.GetFastEnumerator();
// moves iterator to the first item of the slice;
// starts either from beginning or from the end (which one is more efficient):
if (offset < array.Count - offset)
{
for (int i = -1; i < offset; i++)
if (iterator.MoveNext() == false)
break;
}
else
{
for (int i = array.Count; i > offset; i--)
if (iterator.MovePrevious() == false)
break;
}
// copies the slice:
PhpArray result = new PhpArray(length);
int ikey = 0;
for (int i = 0; i < length; i++)
{
var entry = iterator.Current;
// integer keys are reindexed if preserveKeys is false, string keys are not touched:
if (preserveKeys || entry.Key.IsString)
{
result.Add(entry.Key, entry.Value);
}
else
{
result.Add(ikey++, entry.Value);
}
iterator.MoveNext();
}
//result.InplaceCopyOnReturn = true;
return result;
}