从数组中提取负数和非负数值

8

我需要将一个数组分成两个数组。

一个数组将包含所有正数(和零),另一个数组将包含所有负数。

示例数组:

$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];

1
0呢?需要跳过吗? - Ja͢ck
@Jack 0 将被包含在正数组中。 - Ripa Saha
你以后会用这两个数组做什么? - Ja͢ck
5个回答

13

不使用任何数组函数..

非常直接。只需循环遍历数组,检查数字是否小于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
)

8
你可以使用 array_filter 函数,
$positive = array_filter($ts, function ($v) {
  return $v > 0;
});

$negative = array_filter($ts, function ($v) {
  return $v < 0;
});

注意:这将跳过值为0的内容,或者您可以在正数过滤器中将条件更改为>=0以考虑在正数组中。

演示


4
最优雅的方法是使用php的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);' ) ) );

?>

如果(0 > $val)则返回TRUE; 实际上等同于 return 0 > $val; :) - Ja͢ck
@Jack 是的,没错。缩短这个是有道理的,我已经修改了答案。谢谢! - arkascha
返回 ! (0>$val); 也可以写成 return 0<=$val; :) - Ja͢ck
@Jack:是的,再次确认。我这样写是为了可读性,尽管有人可能会对此提出异议;-) - arkascha

4

这里有个思路,你可以编写一个通用函数,根据布尔值结果来拆分一个数组:

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

Demo


0

我建议不要声明两个数组,而是声明一个数组,并在其中包含两个子数组。您可以根据条件评估为零,将子数组的索引设置为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,
  ),
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接