function sort_to($name, $values, $order = "ASC", $clone = false) { $this->init_items(); if (is_array($values)) { $items = $this->_items; $class = get_class($this); // arrays are required to prevent a single variable being overwritten in nested calls to sort_to array_push(WOOF_Collection::$sort_name, $name); array_push(WOOF_Collection::$sort_values, $values); //WOOF_Collection::$sort_name = $name; //WOOF_Collection::$sort_values = $values; if ($clone) { $clone_items = $items; } else { $clone_items = &$this->_items; } if (is_null($name)) { // special case, where we just want to access the item itself (for a simple collection of primitive types) $sort_func = "usort"; if (WOOF::is_assoc($clone_items)) { if (strtoupper($order) == "ASC") { uasort( $clone_items, create_function('$a,$b', '$sv = WOOF_Collection::get_sort_values(); $as = array_search($a, $sv); $bs = array_search($b, $sv); if ($as === false && $bs !== false) return 1; if ($bs === false && $as !== false) return -1; if ($as === $bs) return 0; return ($as < $bs) ? -1 : +1;')); } else { uasort( $clone_items, create_function('$a,$b', '$sv = WOOF_Collection::get_sort_values(); $bs = array_search($b, $sv); $as = array_search($a, $sv); if ($as === false && $bs !== false) return 1; if ($bs === false && $as !== false) return -1; if ($as === $bs) return 0; return ($as < $bs) ? 1 : -1;')); } } else { if (strtoupper($order) == "ASC") { usort( $clone_items, create_function('$a,$b', '$sv = WOOF_Collection::get_sort_values(); $as = array_search($a, $sv); $bs = array_search($b, $sv); if ($as === false && $bs !== false) return 1; if ($bs === false && $as !== false) return -1; if ($as === $bs) return 0; return ($as < $bs) ? -1 : +1;')); } else { usort( $clone_items, create_function('$a,$b', '$sv = WOOF_Collection::get_sort_values(); $bs = array_search($b, $sv); $as = array_search($a, $sv); if ($as === false && $bs !== false) return 1; if ($bs === false && $as !== false) return -1; if ($as === $bs) return 0; return ($as < $bs) ? 1 : -1;')); } } } else { if (strtoupper($order) == "ASC") { usort( $clone_items, create_function('$a,$b', '$sv = WOOF_Collection::get_sort_values(); $sn = WOOF_Collection::get_sort_name(); $as = array_search(WOOF::eval_expression($sn, $a), $sv); $bs = array_search(WOOF::eval_expression($sn, $b), $sv); if ($as === false && $bs !== false) return 1; if ($bs === false && $as !== false) return -1; if ($as === $bs) return 0; return ($as < $bs) ? -1 : +1;')); } else { usort( $clone_items, create_function('$a,$b', '$sv = WOOF_Collection::get_sort_values(); $sn = WOOF_Collection::get_sort_name(); $bs = array_search(WOOF::eval_expression($sn, $b), $sv); $as = array_search(WOOF::eval_expression($sn, $a), $sv); if ($bs === false && $as !== false) return -1; if ($as === $bs) return 0; return ($as < $bs) ? 1 : -1;')); } } array_pop(WOOF_Collection::$sort_name); array_pop(WOOF_Collection::$sort_values); if ($clone) { return new $class($clone_items); } else { return $this; } } return $this; }