16

是否有软件转换器可以自动将此 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')
4

6 回答 6

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));
于 2010-11-07T05:29:36.553 回答
9

我创建了一个名为py2php的 python-to-php 转换器。它可以自动翻译基本逻辑,然后您需要调整库调用等。仍然是实验性的。

这是从 OP 提供的 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__,它无法正确运行,但这些很容易手动修复。

于 2015-11-28T21:49:32.440 回答
8

我已经完成了用 Python 制作 PHP 解释器的 1/2,我可以直截了当地告诉你,实际上有几十个主要的边缘案例发挥了数千种可能性,这使得将 Python 移植到 PHP 几乎是不可能的。Python 具有比 PHP 更强大的语法,同时在语言中更进一步,Python 的 stdlib 与同类中的任何其他语言相比可能是最先进的语言之一。

我的建议是让您的问题更进一步,为什么您需要在 PHP 中使用一组基于 Python 的逻辑。尝试移植/翻译代码的替代方法可能包括从 PHP 到 Python 的子处理,使用 Gearman 让 Python 在后端工作,而 PHP 处理视图逻辑,或者更复杂的解决方案是在两者之间实现服务总线或消息队列PHP 应用程序和 Python 服务。

PS。对任何可读性问题表示歉意,刚刚完成了 2 天的冲刺。

于 2010-11-07T05:48:24.317 回答
2

不存在这样的工具,您必须自己移植代码

于 2010-11-07T05:27:26.053 回答
2

我从https://github.com/dan-da/py2php更改了库 py2php并将其分叉到https://github.com/bunkahle/py2php的新存储库中 您现在还可以使用已翻译的 python 数学库到 PHP 代码。您仍然必须对代码进行调整才能使其正常工作。

于 2019-02-10T13:02:48.763 回答
1

我想知道同样的问题,我在 GitHubGist 网站上找到了这个PyToPhp.py文件。这很简单,似乎是开始的起点。

我去看看!!!

于 2014-05-23T17:19:26.363 回答