2011-04-27 37 views
6

Tôi đang làm việc trên một dự án mà tôi cần thực hiện một hàm sẽ phân tích 4 phép toán mặc định (cộng, trừ, nhân, chia). Sẽ tốt hơn nếu hàm có thể phân tích các phép toán giữa các dấu ngoặc. Vì vậy, phải là chức năng đầu tiên kiểm tra hoạt động nhân và chia (nên kiểm tra sau khi phân tích cú pháp tất cả các hoạt động giữa các dấu ngoặc đơn nếu chúng tồn tại và quy tắc đó sẽ áp dụng cho các hoạt động của khung [vấn đề lớn nhất là dấu ngoặc đơn có thể chứa dấu ngoặc vuông]). Sau khi thực hiện tất cả các phép tính nhân và chia, nó phải thực hiện tất cả các phép toán cộng và trừ. Số cuối cùng phải được trả về bởi các hàm.Phân tích các phép tính toán với PHP

Một bổ sung thú vị khác là chuỗi RegExp sẽ kiểm tra hoạt động toán học.

Cảm ơn trước!

+2

Đối với vấn đề ngoặc đơn: bạn nên học đệ quy để tìm hiểu đệ quy –

+0

'Câu hỏi' bắt đầu bằng "Tôi đang làm việc trên một dự án" nhưng nhanh chóng trở thành danh sách mong muốn các tính năng. – pavium

+2

Nghe giống như một bài tập về nhà với tôi. Đây có phải là bài tập về nhà không? – KyleWpppd

Trả lời

4

này nên được khá an toàn:

function do_maths($expression) { 
    eval('$o = ' . preg_replace('/[^0-9\+\-\*\/\(\)\.]/', '', $expression) . ';'); 
    return $o; 
} 

echo do_maths('1+1'); 
+0

Tôi nên thay đổi điều gì nếu tôi phải hỗ trợ số nổi? / –

3

Bạn có thể sử dụng eval() (CẢNH BÁO: đảm bảo những gì nhập vào là một phép toán và không phải một số mã đầu vào hoặc php tùy ý khác).

$input = "3 + (4 - 2 * 8)/2"; 

eval('$result = ' . $input . ';'); 

echo "The result is $result"; 
+0

Tôi tự hỏi nếu nó có thể làm cho một eval() 100% an toàn cho các biểu thức toán học nếu bạn đã kiểm tra cho bất kỳ nhân vật không được công nhận; tức là 'preg_replace ('~ [^ 0-9.() - + * /] ~', '', $ input); ' – Martijn

+0

@Martijn có lẽ sẽ hoạt động, và cũng là phương thức được sử dụng trong câu trả lời được chấp nhận. –

0

Cụm từ thông dụng không phải là câu trả lời ở đây; Tôi đề nghị sử dụng một expression tree trong đó tất cả các nút đầu cuối là hằng số hoặc biến, và phần còn lại của các nút là toán tử. Ví dụ, 2 + 3 * 4 trở thành:

+ --- 2 
    | 
    --- * --- 3 
     | 
     --- 4 

Sau đó, bạn đánh giá biểu thức bằng cách sử dụng một depth-first traversal. Trong PHP, rất khó để biểu diễn cây, nhưng bạn có thể sử dụng một thư viện cài sẵn như một người bình luận được đề xuất hoặc trình bày chúng bằng cách sử dụng một mảng kết hợp của các mảng.

0

nếu bạn muốn có một sự an toàn toán tử phân tích cú pháp, sau đó eval sẽ không làm điều đó. bcParserPHP có thể làm điều đó. Nó được thực hiện trong PHP và không sử dụng eval, do đó nó rất an toàn.

Các vấn đề liên quan