<?php 
 
    namespace Taschenrechner\Classes; 
 
    class Term { 
        private $array; 
        private $term; 
        private $numeric; 
        private $operationen; 
        public function __construct(String $term, Array $operationen, $numeric) { 
                //Initialisiere alle möglichen Operationen und speichere Sie im Attribut Operationen 
                $this->operationen = $operationen; 
                $this->term = $term; 
                $this->numeric = $numeric; 
                //Array mit dem intern gearbeitet wird 
                //statt str_split 
                $this->array =preg_split('/(?<!^)(?!$)/u', $term ); 
        } 
         
         
        //Überprüfe ob der Term gültig ist.     
        public function verify() { 
             
            $this->array= $this->numeric->concatinateArray($this->array, $this->operationen); 
 
            if($this->sizeOneAndNotNumeric()) { 
                return false; 
            } 
            for($term_index=0; $term_index<sizeof($this->array); $term_index++) { 
                $bool = 0; 
                for($operation_index = 0; $operation_index<sizeof($this->operationen);$operation_index++) { 
                    if($this->isNotNumericOrKommaOrOperand($term_index, $operation_index)) { 
                        $bool++; 
                    } 
                    for($operation_index2=1; $operation_index2<sizeof($this->operationen);$operation_index2++) { 
                        if($this->operationen[$operation_index2]["object"]->getSign() == "-" 
                        || $this->operationen[$operation_index2]["object"]->getSign() == "+") { 
                            continue; 
                        } 
 
                        if($this->isTwoConsecutiveOperandAndNotParanthese($operation_index, $term_index, $operation_index2)) { 
                            return false; 
                        } 
                         
                    } 
                 
                } 
                 
                //Überprüft das logische UND der Operationen 
                if($bool >= sizeof($this->operationen)) { 
                    return false;                             
 
                } else { 
                    $bool=0;                 
                } 
                 
            } 
            return true; 
        } 
        private function sizeOneAndNotNumeric() { 
            if(sizeof($this->array)==1) { 
                if(!is_numeric($this->array[0])) { 
                    return true; 
                } 
            } 
            return false; 
 
        } 
        private function isNotNumericOrKommaOrOperand($term_index, $operation_index) { 
            if((strcmp($this->array[$term_index], $this->operationen[$operation_index]["object"]->getSign())!=0)&&(!is_numeric($this->array[$term_index])) 
            &&($this->array[$term_index]!=",")&&($this->array[$term_index]!=".")) { 
                return true; 
            } 
            return false; 
        } 
 
        private function isTwoConsecutiveOperandAndNotParanthese($operation_index, $term_index, $operation_index2) { 
            if((strcmp($this->array[$term_index], $this->operationen[$operation_index]["object"]->getSign())==0) 
            &&(array_key_exists($term_index+1, $this->array)) 
            &&(strcmp($this->array[$term_index+1], $this->operationen[$operation_index2]["object"]->getSign())==0) 
            &&($this->array[$term_index] != ")") 
            &&($this->array[$term_index+1]!="(") 
            ) { 
                 
                return false; 
            } 
 
        } 
        /*Löse den Term auf */ 
        public function resolve() { 
            $this->array =preg_split('/(?<!^)(?!$)/u', $this->term ); 
 
 
            while(sizeof($this->array)>1) { 
                     
                    $this->array = $this->numeric->concatinateArray($this->array, $this->operationen); 
                    $this->term = implode("", $this->array); 
 
                    $object = $this->getPriorityOperation(); 
             
                    if($object != NULL) { 
                        $this->term = $object->findAndCalculateTerm($this->term, $this->operationen); 
                        $this->array= preg_split('/(?<!^)(?!$)/u', $this->term ); 
                        $this->array = $this->numeric->concatinateArray($this->array, $this->operationen); 
 
                        $this->term = implode("", $this->array); 
 
                    } else { 
                        $this->array=array(0); 
                        break; 
                    } 
            } 
                 
            return $this->term; 
        } 
         
            private function getPriorityOperation() { 
             
            $max_priority = -1; 
            $priority = NULL; 
            for($operation_index=0;$operation_index<sizeof($this->array);$operation_index++) { 
                for($term_index=0; $term_index<sizeof($this->operationen);$term_index++) { 
                     
                    if(($this->operationen[$term_index]["reversepriority"]>$max_priority)&&(strcmp($this->array[$operation_index], $this->operationen[$term_index]["object"]->getSign())==0)) { 
                        $max_priority = $this->operationen[$term_index]["reversepriority"]; 
                        $priority = $this->operationen[$term_index]["object"]; 
                         
                    } 
                } 
            } 
             
            return $priority; 
        }     
    } 
?> 
 
 |