[英]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.