PHP Classes

File: public/Classes/Term.php

Recommend this page to a friend!
  Classes of stefan  >  PHP Calculator  >  public/Classes/Term.php  >  Download  
File: public/Classes/Term.php
Role: Class source
Content type: text/plain
Description: Class source
Class: PHP Calculator
Calculate the result of multiple math operations
Author: By
Last change: resolve error ( and sin( in same term
Date: 10 months ago
Size: 4,079 bytes
 

Contents

Class file image Download
<?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;
        }
    }
?>