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 は、そのクラスの他の言語と比較しておそらく最も高度な言語の 1 つです。

私のお勧めは、あなたの質問を一歩遡って、なぜ PHP で一連の Python ベースのロジックが必要なのかということです。コードを移植/変換しようとする代わりに、PHP から Python へのサブプロセッシング、Gearman を使用して Python をバックエンドで動作させ、PHP がビュー ロジックを処理すること、またははるかに複雑なソリューションとして、サービス バスまたはメッセージ キューを間に実装することが考えられます。 PHP アプリケーションと Python サービス。

PS。読みやすさの問題についてはお詫びします。2 日間のスプリントをたった今終了しました。

于 2010-11-07T05:48:24.317 に答える
2

そのようなツールは存在しません。コードを自分で移植する必要があります

于 2010-11-07T05:27:26.053 に答える
1

私も同じ疑問を抱いていたところ、GitHubGist サイトでこのPyToPhp.pyファイルを見つけました。シンプルで、最初の出発点のようです。

見てみます!!!

于 2014-05-23T17:19:26.363 に答える