Variant ArrayUtil::Reverse(CArrRef input, bool preserve_keys /* = false */) { if (input.empty()) { return input; } Array ret = Array::Create(); for (ssize_t pos = input->iter_end(); pos != ArrayData::invalid_index; pos = input->iter_rewind(pos)) { Variant key(input->getKey(pos)); if (preserve_keys || key.isString()) { ret.setWithRef(key, input->getValueRef(pos), true); } else { ret.appendWithRef(input->getValueRef(pos)); } } return ret; }
int64_t f_array_unshift(int _argc, VRefParam array, CVarRef var, CArrRef _argv /* = null_array */) { if (array.toArray()->isVectorData()) { if (!_argv.empty()) { for (ssize_t pos = _argv->iter_end(); pos != ArrayData::invalid_index; pos = _argv->iter_rewind(pos)) { array.prepend(_argv->getValueRef(pos)); } } array.prepend(var); } else { { Array newArray; newArray.append(var); if (!_argv.empty()) { for (ssize_t pos = _argv->iter_begin(); pos != ArrayData::invalid_index; pos = _argv->iter_advance(pos)) { newArray.append(_argv->getValueRef(pos)); } } for (ArrayIter iter(array); iter; ++iter) { Variant key(iter.first()); CVarRef value(iter.secondRef()); if (key.isInteger()) { newArray.appendWithRef(value); } else { newArray.lvalAt(key, AccessFlags::Key).setWithRef(value); } } array = newArray; } // Reset the array's internal pointer if (array.is(KindOfArray)) { array.array_iter_reset(); } } return array.toArray().size(); }