簡體   English   中英

我們可以在自定義函數中包含條件作為參數嗎?

[英]Can we include condition as an argument in custom functions?

假設我有一個多維數組

$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和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]> = 10 && $ array [0] [$ i] <= 20 (條件 - >第一個子數組的值> = 10且<= 20)

結果會是

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

另一個條件

$ array [1] [$ i]> = 20 && $ array [1] [$ i] <= 30 (條件 - >第二個子數組的值> = 20且<= 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>";
    }
?>

謝謝大家的回復,它以一種很棒的方式幫助了我...... !!

您的問題是關於過濾您的數組。 為此,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() - 你可以原生地執行它,我認為你不需要自己的自定義函數來執行此操作(因為在這種情況下包裝本機函數沒有意義)。

您現有的代碼非常接近。

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));

鑒於您的最新更新,您可以執行此類操作。 但我仍然不確定你的目標是什么,所以這可能完全是午餐。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM