我们可以在自定义函数中包含条件作为参数吗?

时间:2013-12-17 05:09:22

标签: php arrays function conditional-statements

假设我有一个多维数组

$num1 = array(1, 4, 6, 12, 15, 16, 21, 34, 25, 29);
$num2 = array(1, 5, 18, 19, 23, 19, 23, 45, 23, 16);
$array = array($num1, $num2);

我想从$ array中提取$ array [0]值满足某些条件的所有值,例如具有10和10之间的值20。

从$ array获取所需的值我可以使用以下代码:

$count = count($array[0]);
$new_array = array_fill(0, $count, array());
for($i = 0; $i < $count; $i++)
    {
    if($array[0][$i] >= 10 && $array[0][$i] <= 20)
        {
        $new_array[0][] = $array[0][$i];
        $new_array[1][] = $array[1][$i];
        }
    }
//I get the array that I need
print_r($new_array);

这是我每次需要更改的代码

$ array [0] [$ i]&gt; = 10&amp;&amp; $ array [0] [$ i]&lt; = 20 (条件 - &gt;来自第一个子数组的值> = 10且&lt; = 20)

结果将是

Array(0 => Array(0 => 12, 1 => 15, 2 => 16), 1 => Array(0 => 19, 1 => 23, 2 => 19))

另一个条件

$ array [1] [$ i]&gt; = 20&amp;&amp; $ array [1] [$ i]&lt; = 30 (条件 - &gt;来自第二个子数组的值> = 20且&lt; = 30)

结果将是

Array(0 => Array(0 => 15, 1 => 21, 2 => 25), 1 => Array(0 => 23, 1 => 23, 2 => 23))

我需要使用不同的条件对不同的列进行此类操作。因此,我不想每次都编写循环代码,而是想创建一个以条件作为参数的函数。是否有可能,如果是这样的话?

我想有一个带有三个参数的函数,如下所示

function_name ($array, $column_num, $condition)

也欢迎任何替代解决方案.... :)

我最终使用的代码完成了这项工作....

<?php
function mdarray_condition_extract($array, $column, $condition) 
    {
    $count = count($array[0]);
    $nsac = count($array);
    $new_array = array_fill(0, $nsac, array());
    for ($i = 0; $i < $count; $i++)
        {
        $valToTest = $array[$column][$i];
        if ($condition($valToTest))
            {
            for($k = 0; $k < $nsac; $k++)
                {
                $new_array[$k][] = $array[$k][$i];
                }
            }
        }
    return $new_array;
    }

$array = array(array(1, 4, 6, 12, 15, 16), array(1, 5, 18, 19, 23, 19));
$columns = array(0,1,0);
$conditions =   [
                0 => function($val){return $val >= 10 && $val <= 20;},
                1 => function($val){return $val >= 20 && $val <= 30;},
                2 => function($val){return $val == 6 || $val == 20;}
                ];
$combo = array($columns, $conditions);
$condcount = count($combo[0]);
for($i = 0; $i < $condcount; $i++)
    {
    print_r(mdarray_condition_extract($array, $combo[0][$i], $combo[1][$i])); echo "<br><br>";
    }
?>

感谢大家的回应,它以一种很棒的方式帮助了我...... !!

3 个答案:

答案 0 :(得分:1)

您的问题是关于过滤您的数组。为此,PHP具有内置函数array_filter()。它需要回调过滤值。

如果我正确地提出了您的问题,您希望将过滤器应用于您的子阵列 - 并且可能具有不同的条件。通常,如果静态地这样做,那就是:

$array[0] = array_filter($array[0], function($x)
{
   return $x>=10 && $x<=20; //item between 10 and 20
});

- 但如果您有每列的预定义列表,则可以填写地图:

$conditions = [
   //column index => condition callback:
   0 => function($x){ return $x>=10 && $x<=20; },
   1 => function($x){ return $x==50 || $x==80; },
   //e t.c.
];

foreach($array as $key=>$column)
{
   if(array_key_exists($key, $conditions))
   {
      $array[$key] = array_filter($array[$key], $conditions[$key]);
   }
}

所以,使用array_filter() - 你可以原生地做,我认为你不需要你自己的自定义函数来做到这一点(因为在这种情况下包装本机函数没有意义)。

答案 1 :(得分:1)

您现有的代码非常接近。

function filterParallelArrays($array, $predicateFilterIndex, $predicate) 
{
    $count = count($array[0]);
    $new_array = array_fill(0, $count, array());
    for ($i = 0; $i < $count; $i++)
    {
        $valToTest = $array[$predicateFilterIndex][$i];
        if ($predicate($valToTest))
        {
            $new_array[0][] = $array[0][$i];
            $new_array[1][] = $array[1][$i];
        }
    }
    return $new_array;
}


$predicate = function($val)
{
    return $val >= 10 && $val <= 20;
};

print_r(filterParallelArrays($array, 0, $predicate));

答案 2 :(得分:0)

鉴于您的最新更新,您可以执行此类操作。但我仍然不确定你的目标是什么,所以这可能完全是午餐。

function array_function($key, $lcond, $rcond)
{
    $count = count($array[0]);
    $new_array = array_fill(0, $count, array());
    for($i = 0; $i < $count; $i++)
    {
        if($array[$key][$i] >= $lcond && $array[$key][$i] <= $rcond)
        {
            $new_array[0][] = $array[0][$i];
            $new_array[1][] = $array[$key][$i];
        }
    }
    //I get the array that I need
    return $new_array;
}