Esempio n. 1
0
  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;
    
  }