我正在尝试构建一个工具来平衡PHP中多维数组的值。数组样本:
$t[1][1]=2;
$t[1][2]=3;
$t[2][1]=5;
$t[3]=6;
$t[4][1][1]=9;
$t[4][1][2]=10;
$t[4][2][1]=12;
$t[4][2][2]=13;
请注意,父母没有价值(因为他们有孩子)。我有这个:
function chklevel($s) {
$l = explode(".",$s);
}
这使我能够将chklevel称为
chklevel("4.2.2")
让它返回13,但我也希望能够打电话
chklevel("4")
并返回11(这是4.1.1(9),4.1.2(10),4.2.1(12)和4.2.2(13)的平均值。
有什么想法吗?
答案 0 :(得分:1)
我必须在两个函数中执行它(仅仅因为搜索的递归性质,但这是我的出价:
function mdarray_avg($array, $level = ''){
if (!is_array($array)) throw new Exception("First argument must be an array");
if (!is_string($level)) throw new Exception("Second argument must be string");
$ary = $array;
$levels = explode('.',$level);
foreach ($levels as $lvl){
if (array_key_exists($lvl,$ary))
$ary = $ary[$lvl];
else
throw new Exception("Level {$level} doesn't exist");
}
$numbers = _mdarray_avg($ary);
$sum = array_sum($numbers);
return ($sum > 0 ? $sum / count($numbers) : 0);
}
function _mdarray_avg($array){
if (!is_array($array)) return array($array);
$numbers = array();
foreach ($array as $element){
if (is_array($element))
$numbers = array_merge($numbers,_mdarray_avg($element));
else
$numbers[] = $element;
}
return $numbers;
}
像这样使用它:
echo "Average: ".mdarray_avg($t,'4'); // returns 11, as expected.
$t
是要搜索的数组,'4'
是您要搜索的关卡(也可能是'1'
,'4.2'
等等。
另外,一个有趣的说明,免除第二个参数平均整个数组,在这种情况下我返回 7.5 ( avg(2,3,5,6,9,10,12) ,13))
答案 1 :(得分:0)
这是我的解决方案:
function chklevel($t) {
for ($i = 1; $i < func_num_args(); $i++) {
if (is_array($t) && isset($t[func_get_arg($i)]))
$t = $t[func_get_arg($i)];
}
return GetAvg($t);
}
function GetAvg($arr) {
if (is_array($arr)) {
$avg = 0;
foreach ($arr as $v) {
$avg += GetAvg($v);
}
$avg /= count($arr);
} else if (is_numeric($arr)) {
$avg = $arr;
}
return $avg;
}
我更喜欢这样的函数调用:chklevel($t, 4,2,2);
但您可以轻松地修改字符串:
function chklevel($t, $s) {
$indexes = explode(".", $s);
for ($i = 0; $i < count($indexes); $i++) {
if (is_array($t) && isset($t[$indexes[$i]]))
$t = $t[$indexes[$i]];
}
return GetAvg($t);
}