我需要将一个数组分成两个数组。
一个数组将包含所有正数(和零),另一个数组将包含所有负数。
示例数组:
$ts = [7,-10,13,8,0,4,-7.2,-12,-3.7,3.5,-9.6,6.5,-1.7,-6.2,7];
负结果数组:
[-10,-7.2,-12,-3.7,-9.6,-1.7,-6.2];
非负结果数组:
[7,13,8,0,4,3.5,6.5,7];
我需要将一个数组分成两个数组。
一个数组将包含所有正数(和零),另一个数组将包含所有负数。
示例数组:
$ts = [7,-10,13,8,0,4,-7.2,-12,-3.7,3.5,-9.6,6.5,-1.7,-6.2,7];
负结果数组:
[-10,-7.2,-12,-3.7,-9.6,-1.7,-6.2];
非负结果数组:
[7,13,8,0,4,3.5,6.5,7];
非常直接。只需循环遍历数组,检查数字是否小于0,如果是,则将其推入负数数组中,否则将其推入正数数组中。
<?php
$ts=array(7,-10,13,8,4,-7.2,-12,-3.7,3.5,-9.6,6.5,-1.7,-6.2,7);
$pos_arr=array(); $neg_arr=array();
foreach($ts as $val)
{
($val<0) ? $neg_arr[]=$val : $pos_arr[]=$val;
}
print_r($pos_arr);
print_r($neg_arr);
输出:
Array
(
[0] => 7
[1] => 13
[2] => 8
[3] => 4
[4] => 3.5
[5] => 6.5
[6] => 7
)
Array
(
[0] => -10
[1] => -7.2
[2] => -12
[3] => -3.7
[4] => -9.6
[5] => -1.7
[6] => -6.2
)
$positive = array_filter($ts, function ($v) {
return $v > 0;
});
$negative = array_filter($ts, function ($v) {
return $v < 0;
});
注意:这将跳过值为0的内容,或者您可以在正数过滤器中将条件更改为>=0
以考虑在正数组中。
演示。
array_filter()
函数:<?php
$ts = [ 7,-10,13,8,4,-7.2,-12,-3.7,3.5,-9.6,6.5,-1.7,-6.2,7 ];
print_r( array_filter( $ts, function( $val ) { return (0>$val); } ) );
print_r( array_filter( $ts, function( $val ) { return ! (0>$val); } ) );
?>
如果您仍在使用较旧的php版本,则需要进行一些更长的实现:
<?php
$ts = array( 7,-10,13,8,4,-7.2,-12,-3.7,3.5,-9.6,6.5,-1.7,-6.2,7 );
print_r( array_filter( $ts, create_function( '$val', 'return (0>$val);' ) ) );
print_r( array_filter( $ts, create_function( '$val', 'return ! (0>$val);' ) ) );
?>
return 0 > $val;
:) - Ja͢ck这里有个思路,你可以编写一个通用函数,根据布尔值结果来拆分一个数组:
// splits an array based on the return value of the given function
// - add to the first array if the result was 'true'
// - add to the second array if the result was 'false'
function array_split(array $arr, callable $fn)
{
$a = $b = [];
foreach ($arr as $key => $value) {
if ($fn($value, $key)) {
$a[$key] = $value;
} else {
$b[$key] = $value;
}
}
return [$a, $b];
}
list($positive, $negative) = array_split($ts, function($item) {
return $item >= 0;
});
print_r($positive);
print_r($negative);
我建议不要声明两个数组,而是声明一个数组,并在其中包含两个子数组。您可以根据条件评估为零,将子数组的索引设置为0或1,或者更进一步,声明一个查找数组,以用表达性词语替换整数键。
无论您选择创建一个数组还是两个数组,都应该只对输入数组进行一次循环。进行两次循环或两次调用array_filter()
是不必要的低效率操作。
代码:(演示)
$ts = [7,-10,13,8,4,-7.2,-12,-3.7,3.5,-9.6,6.5,-1.7,-6.2,7];
const KEY_NAMES = [0 => 'negative', 1 => 'non-negatuve'];
$result = [];
foreach ($ts as $v) {
$result[KEY_NAMES[$v >= 0]][] = $v;
}
var_export($result);
输出:
array (
'non-negatuve' =>
array (
0 => 7,
1 => 13,
2 => 8,
3 => 4,
4 => 3.5,
5 => 6.5,
6 => 7,
),
'negative' =>
array (
0 => -10,
1 => -7.2,
2 => -12,
3 => -3.7,
4 => -9.6,
5 => -1.7,
6 => -6.2,
),
)