दिलचस्प पोस्ट
XSLT वेब ब्राउज़र में काम नहीं कर रहा है "पैरामीटर" बनाम "तर्क" सीएसवी निर्यात एन्कोडिंग मुद्दे के लिए जावास्क्रिप्ट JSTL कैसे स्थापित करें? निरपेक्ष यूरी: http://java.sun.com/jstl/core का समाधान नहीं किया जा सकता ios8 iPad uiwevview popover प्रदर्शित करते समय क्रैश करता है जब उपयोगकर्ता ड्रॉप डाउन सूची HTML चयन टैग को नल डालता है प्रिंट के लिए जावास्क्रिप्ट इवेंट हैंडलर ग्रांड सेंट्रल डिस्पैच में धागे की सीमा पर वैकल्पिक हल? iPhone ऐप में स्थानीय नोटिफिकेशन कैसे बनाएं Linux / mac OSX में नेटवर्क एडाप्टर आँकड़े कैसे प्राप्त करें? Magento – एक विशिष्ट विशेषता मान के साथ उत्पादों को पुनर्प्राप्त करें अगर फ़ील्ड MySQL में शून्य है तो 0 लौटें कोड-पीछे से जावास्क्रिप्ट फ़ंक्शन कैसे कॉल करें va_list का उपयोग करके printf को कॉल करें जावा – कैसे मैक ओएस पर प्रतिलिपि और चिपकाएँ मेनू में हुक बूटस्ट्रैप ड्रॉपडाउन बंद होने पर बंद हो जाता है

कैसे PHP में एक कैलकुलेटर बनाने के लिए?

मैं साधारण बीजीय अभिव्यक्तियों की गणना करना चाहता हूं, जैसे 8*(5+1) , एक सामान्य उपयोगकर्ता के द्वारा <input> टैग के माध्यम से दर्ज किया जाता है (जिसका अर्थ है, सामान्य संकेतन : कोई वाक्यविन्यास परिवर्तन जैसे Multiply(8, Add(5, 1))) इसके अलावा, यह सभी चरणों को दिखाने के लिए है, लेकिन यह मुश्किल नहीं है समस्या, अभी, अभिव्यक्तियों के मूल्य की गणना कर रही है

नोट: यह है जो मैंने अभी तक सोचा है, जो काफी अक्षम है लेकिन यह एक सशक्त समाधान है। बस तारों की जगह जहां संभव हो: हमारे उदाहरण में, स्ट्रिंग 5+1 पहचानें और इसे 6 साथ बदलें फिर, फिर लूप, (6) साथ (6) जगह, लूप दोबारा, और 8*6 को 48 साथ बदलें। गुणा करने के लिए कोड, उदाहरण के लिए, इस तरह दिखना चाहिए:

 for ($a=1; $a < 1000; $a++) { for ($b=1; $b < 1000; $b++) { string_replace($a . '*' . $b, $a*$b, $string); } } 

Solutions Collecting From Web of "कैसे PHP में एक कैलकुलेटर बनाने के लिए?"

आपकी ज़रूरतों के अनुसार, मैं शंटिंग यार्ड एल्गोरिदम में देख रहा हूं। यह कार्यान्वयन करना बहुत आसान है, और काफी अच्छा काम करता है।

यहाँ एक उदाहरण है जिसे मैंने थोड़ी देर पहले उठाया था: जीआईएसटी

यहां एक ब्लॉक में कोड कॉपी / चिपकाया गया है:

अभिव्यक्ति परिभाषाएं:

 class Parenthesis extends TerminalExpression { protected $precidence = 7; public function operate(Stack $stack) { } public function getPrecidence() { return $this->precidence; } public function isNoOp() { return true; } public function isParenthesis() { return true; } public function isOpen() { return $this->value == '('; } } class Number extends TerminalExpression { public function operate(Stack $stack) { return $this->value; } } abstract class Operator extends TerminalExpression { protected $precidence = 0; protected $leftAssoc = true; public function getPrecidence() { return $this->precidence; } public function isLeftAssoc() { return $this->leftAssoc; } public function isOperator() { return true; } } class Addition extends Operator { protected $precidence = 4; public function operate(Stack $stack) { return $stack->pop()->operate($stack) + $stack->pop()->operate($stack); } } class Subtraction extends Operator { protected $precidence = 4; public function operate(Stack $stack) { $left = $stack->pop()->operate($stack); $right = $stack->pop()->operate($stack); return $right - $left; } } class Multiplication extends Operator { protected $precidence = 5; public function operate(Stack $stack) { return $stack->pop()->operate($stack) * $stack->pop()->operate($stack); } } class Division extends Operator { protected $precidence = 5; public function operate(Stack $stack) { $left = $stack->pop()->operate($stack); $right = $stack->pop()->operate($stack); return $right / $left; } } class Power extends Operator { protected $precidence=6; public function operate(Stack $stack) { $left = $stack->pop()->operate($stack); $right = $stack->pop()->operate($stack); return pow($right, $left); } } abstract class TerminalExpression { protected $value = ''; public function __construct($value) { $this->value = $value; } public static function factory($value) { if (is_object($value) && $value instanceof TerminalExpression) { return $value; } elseif (is_numeric($value)) { return new Number($value); } elseif ($value == '+') { return new Addition($value); } elseif ($value == '-') { return new Subtraction($value); } elseif ($value == '*') { return new Multiplication($value); } elseif ($value == '/') { return new Division($value); } elseif ($value == '^') { return new Power($value); } elseif (in_array($value, array('(', ')'))) { return new Parenthesis($value); } throw new Exception('Undefined Value ' . $value); } abstract public function operate(Stack $stack); public function isOperator() { return false; } public function isParenthesis() { return false; } public function isNoOp() { return false; } public function render() { return $this->value; } } 

स्टैक (वास्तव में सरल कार्यान्वयन):

 class Stack { protected $data = array(); public function push($element) { $this->data[] = $element; } public function poke() { return end($this->data); } public function pop() { return array_pop($this->data); } } 

और अंत में, निष्पादक वर्ग:

 class Math { protected $variables = array(); public function evaluate($string) { $stack = $this->parse($string); return $this->run($stack); } public function parse($string) { $tokens = $this->tokenize($string); $output = new Stack(); $operators = new Stack(); foreach ($tokens as $token) { $token = $this->extractVariables($token); $expression = TerminalExpression::factory($token); if ($expression->isOperator()) { $this->parseOperator($expression, $output, $operators); } elseif ($expression->isParenthesis()) { $this->parseParenthesis($expression, $output, $operators); } else { $output->push($expression); } } while (($op = $operators->pop())) { if ($op->isParenthesis()) { throw new RuntimeException('Mismatched Parenthesis'); } $output->push($op); } return $output; } public function registerVariable($name, $value) { $this->variables[$name] = $value; } public function run(Stack $stack) { while (($operator = $stack->pop()) && $operator->isOperator()) { $value = $operator->operate($stack); if (!is_null($value)) { $stack->push(TerminalExpression::factory($value)); } } return $operator ? $operator->render() : $this->render($stack); } protected function extractVariables($token) { if ($token[0] == '$') { $key = substr($token, 1); return isset($this->variables[$key]) ? $this->variables[$key] : 0; } return $token; } protected function render(Stack $stack) { $output = ''; while (($el = $stack->pop())) { $output .= $el->render(); } if ($output) { return $output; } throw new RuntimeException('Could not render output'); } protected function parseParenthesis(TerminalExpression $expression, Stack $output, Stack $operators) { if ($expression->isOpen()) { $operators->push($expression); } else { $clean = false; while (($end = $operators->pop())) { if ($end->isParenthesis()) { $clean = true; break; } else { $output->push($end); } } if (!$clean) { throw new RuntimeException('Mismatched Parenthesis'); } } } protected function parseOperator(TerminalExpression $expression, Stack $output, Stack $operators) { $end = $operators->poke(); if (!$end) { $operators->push($expression); } elseif ($end->isOperator()) { do { if ($expression->isLeftAssoc() && $expression->getPrecidence() <= $end->getPrecidence()) { $output->push($operators->pop()); } elseif (!$expression->isLeftAssoc() && $expression->getPrecidence() < $end->getPrecidence()) { $output->push($operators->pop()); } else { break; } } while (($end = $operators->poke()) && $end->isOperator()); $operators->push($expression); } else { $operators->push($expression); } } protected function tokenize($string) { $parts = preg_split('((\d+|\+|-|\(|\)|\*|/)|\s+)', $string, null, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); $parts = array_map('trim', $parts); return $parts; } } 

यह पहले इनपुट (शब्द सीमा और टोकन पर आधारित) को टोकाने के द्वारा काम करता है। फिर, यह एक आरपीएन (रिवर्स पोलिश नोटेशन) स्टैक में इनपुट को बदलने के लिए उस पर शंटिंग यार्ड एल्गोरिथ्म चलाता है। फिर, यह सिर्फ स्टैक निष्पादित करने का मामला है। यहाँ एक त्वरित उदाहरण है:

 $math = new Math(); $answer = $math->evaluate('(2 + 3) * 4'); var_dump($answer); // int(20) $answer = $math->evaluate('1 + 2 * ((3 + 4) * 5 + 6)'); var_dump($answer); // int(83) $answer = $math->evaluate('(1 + 2) * (3 + 4) * (5 + 6)'); var_dump($answer); // int(231) $math->registerVariable('a', 4); $answer = $math->evaluate('($a + 3) * 4'); var_dump($answer); // int(28) $math->registerVariable('a', 5); $answer = $math->evaluate('($a + $a) * 4'); var_dump($answer); // int(40) 

अब, यह उदाहरण आपके लिए अपेक्षाकृत अधिक जटिल हो सकता है। इसका कारण यह है कि यह समूहीकरण और संचालक वरीयता भी संभालता है। लेकिन यह चलने वाले एल्गोरिदम का एक सभ्य उदाहरण है जो ईवाल का उपयोग नहीं करता है और चर का समर्थन करता है …

बीसीपीर्स पीएचपी नामक एक मठ पारसर वर्ग है जो ब्याज का हो सकता है।

काफी सरल और सुंदर शक्तिशाली लगता है

अपनी साइट से उदाहरण कोड:

 $parser = new MathParser(); $parser->setVariable('X', 5); $parser->setVariable('Y', 2); $parser->setExpression('COS(X)+SIN(Y)/2'); echo $parser->getValue(); 

दुर्भाग्य से, यह एक वाणिज्यिक उत्पाद है; मुझे नहीं पता है कि वह आपको इसे इस्तेमाल करने से रोक देगा या नहीं (अनुमान करें कि यह कीमत पर और आपकी आवश्यकताओं पर निर्भर करता है)

एक गैर-वाणिज्यिक विकल्प यह हो सकता है: http://www.phpclasses.org/package/2695-PHP-Safely-evaluate-mathematical-expressions.html

ध्यान दें कि यह वर्ग आंतरिक रूप से eval() का उपयोग करता है, जो संभव है अगर मैं ऐसा करने से बचता।

असफल होने पर, अपनी भाषा के पार्सर लिखना आदर्श समाधान होगा, लेकिन PHP में ऐसा करने के लिए वास्तव में समझदार नहीं होगा।

मैं किसी भी चीज के इनपुट को छांटकर शुरू करूँगा जो अभिव्यक्ति में नहीं होना चाहिए (यह मानते हुए कि आप केवल जोड़, घटाना, गुणा, विभाजित और कोई भी वैरिएबल नहीं देना चाहते हैं):

  $expr = preg_replace('/[^0-9+*\/-]/', '', $expr); 

और फिर, एक बार मुझे विश्वास है कि उपयोगकर्ता इनपुट में कुछ भी खतरनाक नहीं रहता है, बस अभिव्यक्ति का मूल्यांकन करने के लिए इथ्रू eval () पास करें:

  $result = eval("return $expr;"); 

पहिया को फिर से बदलने की आवश्यकता नहीं है

कोलिंक के सुधार को शामिल करने के लिए संपादित । धन्यवाद!