将Python代码转换为PHP

17 投票
6 回答
45879 浏览
提问于 2025-04-16 06:41

有没有什么软件可以自动把这段Python代码转换成PHP代码呢?

#!/usr/bin/python
import math

def calcNumEntropyBits(s):
        if len(s) <= 0: return 0.0
        symCount = {}
        for c in s:
                if c not in symCount: symCount[c] = 1
                else: symCount[c] += 1
        entropy = 0.0
        for c,n in symCount.iteritems():
                prob = n / float(len(s))
                entropy += prob * (math.log(prob)/math.log(2))
        if entropy >= 0.0: return 0.0
        else: return -(entropy*len(s))

def testEntropy(s):
        print "Bits of entropy in '%s' is %.2f" % (s, calcNumEntropyBits(s))

testEntropy('hello world')
testEntropy('bubba dubba')
testEntropy('aaaaaaaaaaa')
testEntropy('aaaaabaaaaa')
testEntropy('abcdefghijk')

6 个回答

8

我正在用Python制作一个PHP解释器,已经完成了一半。老实说,我发现有很多复杂的情况,这些情况会导致成千上万种可能性,这让把Python转换成PHP几乎变得不可能。Python的语法比PHP更强大,而且在语言的深度上,Python的标准库在同类语言中可能是最先进的。

我建议你先想想,为什么需要在PHP中使用基于Python的逻辑。与其试图把你的代码转换成PHP,你可以考虑其他方法,比如从PHP调用Python的子进程,或者使用Gearman让Python在后台处理工作,而PHP负责显示逻辑。还有一种更复杂的解决方案,就是在PHP应用和Python服务之间实现一个服务总线或消息队列。

PS. 如果有任何阅读上的问题,抱歉,我刚刚完成了两天的工作。

11

我创建了一个叫做 py2php 的工具,可以把Python代码转换成PHP代码。它可以自动翻译一些基本的逻辑,但你还需要手动调整一些库的调用等内容。目前这个工具还在实验阶段。

下面是根据提问者提供的Python代码自动生成的PHP代码。

<?php
require_once('py2phplib.php');
require_once( 'math.php');
function calcNumEntropyBits($s) {
    if ((count($s) <= 0)) {
        return 0.0;
    }
    $symCount = array();
    foreach( $s as $c ) {
        if (!$symCount.__contains__($c)) {
            $symCount[$c] = 1;
        }
        else {
            $symCount[$c] += 1;
        }
    }
    $entropy = 0.0;
    foreach( $symCount->iteritems() as $temp_c ) {
        $prob = ($n / float(count($s)));
        $entropy += ($prob * (math::log($prob) / math::log(2)));
    }
    if (($entropy >= 0.0)) {
        return 0.0;
    }
    else {
        return -($entropy * count($s));
    }
}

function testEntropy($s) {
    pyjslib_printFunc(sprintf('Bits of entropy in \'%s\' is %.2f', new pyjslib_Tuple([$s, calcNumEntropyBits($s)])));
}

testEntropy('hello world');
testEntropy('bubba dubba');
testEntropy('aaaaaaaaaaa');
testEntropy('aaaaabaaaaa');
testEntropy('abcdefghijk');

不过由于数学库的引入和 __contains__ 的问题,这段代码可能无法正确运行,但这些问题手动修正起来还是比较简单的。

14

我不知道有没有现成的把Python代码转换成PHP代码的工具,但其实这个工作应该很简单,因为这两种语言之间有很多相似之处,很容易就能看出来:

function calcNumEntropyBits($s) {
        if (strlen($s) <= 0) return 0.0;
        $symCount = array();
        foreach (str_split($s) as $c) {
                if (!in_array($c,$symCount)) $symCount[$c] = 1;
                else $symCount[$c] ++;
        }
        $entropy = 0.0;
        foreach ($symCount as $c=>$n) {
                $prob = $n / (float)strlen($s);
                $entropy += $prob * log($prob)/log(2);
        }
        if ($entropy >= 0.0) return 0.0;
        else return -($entropy*strlen($s));
}

function testEntropy($s):
        printf("Bits of entropy in '%s' is %.2f",$s,calcNumEntropyBits($s));

testEntropy('hello world');
testEntropy('bubba dubba');
testEntropy('aaaaaaaaaaa');
testEntropy('aaaaabaaaaa');
testEntropy('abcdefghijk');

在第一个函数的最后几行,也可以用标准的PHP三元表达式来写:

return ($entropy >= 0.0)? 0.0: -($entropy*strlen($s));

撰写回答