首页 > 解决方案 > 将javascript函数转换为php

问题描述

我有以下函数,它返回一个百分比数组,四舍五入为 100 或您提供给第二个参数的任何数字,我需要帮助将其转换为 PHP,因为有一些函数,如“Object.assign()”或“.map( )" 我不知道如何将它们翻译成 php。

有问题的代码如下:

function perRound(n, x) {
 for (var r, e = n.length, i = e - 1, a = 0; i >= 0; i--) a += n[i];
 if (0 === a) return Array.apply(null, new Array(e)).map(Number.prototype.valueOf, 0);
 r = [];
 var t = [], u = x / a, o = x;
 for (i = e - 1; i >= 0; i--) o -= r[i] = Math.round(t[i] = n[i] * u);
 if (0 != o) {
  var f = {size: 0};
  if ((t = t.map(function (n) {
   var r = Math.floor(n);
   return r === n ? n : r + .5 - n
  })).forEach(o > 0 ? function (n, r) {
   n <= 0 && (f[r] = !0, f.size++)
  } : function (n, r) {
   n >= 0 && (f[r] = !0, f.size++)
  }), f.size === t.length) return r[0] += o, r;
  for (var m = Object.assign({}, f); o < 0;) {
   f.size === t.length && (f = Object.assign({}, m)), r[s = t.reduce(function (n, r, e) {
    return !0 === f[e] ? n : (r > n.min && (n.min = r, n.minIdx = e), n)
   }, {min: -.5, minIdx: 0}).minIdx] -= 1, 0 === r[s] && (m[s] = !0), f[s] = !0, f.size++, o++
  }
  for (; o > 0;) {
   var s;
   f.size === t.length && (f = {size: invalids}), r[s = t.reduce(function (n, r, e) {
    return !0 === f[e] ? n : (r < n.max && (n.max = r, n.maxIdx = e), n)
   }, {max: .5, maxIdx: 0}).maxIdx] += 1, f[s] = !0, f.size++, o--
  }
 }
 return r
}

这是我到目前为止所得到的:

function perRound($n, $x){
 for ($r, $e = count($n), $i = $e - 1, $a = 0; $i >= 0; $i--){$a += $n[$i];}
 if (0 === $a){ return array_fill(0, $e,null);}
 $r = []; $t = []; $u = $x / $a; $o = $x;
 for ($i = $e - 1; $i >= 0; $i--){} $o -= $r[$i] = round($t[$i] = $n[$i] * $u);}
 if (0 != $o) {
 $f = array('size' => 0);
 /* I don't know what to do with this part
  if (($t = $t.map(function (n) {
   $r = floor($n);
   return $r === $n ? $n : $r + .5 - $n;
  })).forEach($o > 0 ? function ($n, $r) {
   $n <= 0 && ($f[$r] = !0, $f.size++)
  } : function ($n, $r) {
   $n >= 0 && ($f[$r] = !0, $f.size++)
  }), $f.size === $t.length) return $r[0] += $o, $r;
  for ($m = Object.assign({}, $f); $o < 0;) {
   $f.size === $t.length && ($f = Object.assign({}, $m)), $r[$s = $t.reduce(function ($n, $r, $e) {
    return !0 === $f[$e] ? $n : ($r > $n.min && ($n.min = $r, $n.minIdx = $e), $n)
   }, {min: -.5, minIdx: 0}).minIdx] -= 1, 0 === $r[$s] && ($m[$s] = !0), $f[$s] = !0, $f.size++, $o++
  }
 for (; o > 0;) {
   $s;
   count($f) === count($t) && (f = {size: invalids}), r[s = t.reduce(function (n, r, e) {
    return !0 === f[e] ? n : (r < n.max && (n.max = r, n.maxIdx = e), n)
   }, {max: .5, maxIdx: 0}).maxIdx] += 1, f[s] = !0, f.size++, o--
  }
 }
 */
 return $r
}

标签: javascriptphp

解决方案


Javascript 的“对象”实际上只不过是关联数组。 Object.assign()只是创建一个新对象,在您的情况下它是另一个对象的副本,因为它总是用一个空目标(即$m = Object.assign({}, $f))调用。因此,PHP 中的那些转换为基本的新任务。

除此之外,PHP 确实有一个array_map函数。


推荐阅读