假设我有一个多维数组
$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>";
}
?>
感谢大家的回应,它以一种很棒的方式帮助了我...... !!
答案 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;
}