合并帖子值并删除空值


Combine post values and remove empty

我有两组来自$_POST的数组。两者的键将是数字,计数将是相同的,因为它们成对作为名称和数字出现:

$_POST[names]
(
    [0] => First
    [1] => Second
    [2] => 
    [3] => Fourth
)
$_POST[numbers]
(
    [0] => 10
    [1] => 
    [2] => 3
    [3] => 3
)

现在我需要将这两者结合起来,但删除缺少任一值的每个条目。

结果应如下所示:

$finalArray
(
    [First] => 10
    [Fourth] => 3
)

帖子数据是动态创建的,因此可能会根据用户输入缺少不同的值。

我尝试做这样的事情:

if (array_key_exists('names', $_POST)) {
        $names = array_filter($_POST['names']);
        $numbers = array_filter($_POST['numbers']);
        if($names and $numbers) {
           $final = array_combine($names, $numbers);
        }
    }

但我似乎无法正确过滤它,因为它给了我一个错误:

警告:array_combine():两个参数应具有相同数量的元素

使用带有ARRAY_FILTER_USE_BOTH标志的array_filter怎么样?

<?php
    $array1 = [
        0 => "First",
        1 => "Second",
        2 => "",
        3 => "Fourth",
    ];
    $array2 = [
        0 => 10,
        1 => "",
        2 => 3,
        3 => 3,
    ];
    var_dump(array_filter(array_combine($array1, $array2), function($value, $key) {
        return $key == "" || $value == "" ? false : $value;
    }, ARRAY_FILTER_USE_BOTH ));
/*
Output:
array(2) {
  ["First"]=>
  int(10)
  ["Fourth"]=>
  int(3)
}
*/

这里有一个有趣的方法:

$result = array_flip(array_flip(array_filter(array_combine($_POST['names'],
                                                           $_POST['numbers']))));
// create array using $_POST['names'] as keys and $_POST['numbers'] as values
$result = array_combine($_POST['names'], $_POST['numbers']);
// remove entries that have empty values
$result = array_filter($result);
// remove entry with empty key
unset($result[null]);
print_r($result);

如果两个数组的计数相同,并且键始终为数字,则可以执行以下操作:

$total = count($_POST['names']);
$final = array();
for ($i = 0; $i < $total; $i++) {
    if (trim($_POST['names'][$i]) != '' && trim($_POST['numbers'][$i]) != '') {
        $final[$_POST['names'][$i]] = $_POST['numbers'][$i];
    }
}

或者,如果您更喜欢使用foreach而不是for

$final = array();
foreach ($_POST['names'] as $key => $value) {
    if (trim($value) != '' && trim($_POST['numbers'][$key]) != '') {
        $final[$value] = $_POST['numbers'][$key];
    }
}

考虑您之前的信息:

两个键都是数字,计数将相同,因为它们成对作为名称和数字出现

$myNewArray = array();
$count = 0;
foreach ($_POST['names'] as $bufferArray)
{
  if (($bufferArray[$count]!=NULL)&&($_POST['numbers][$count]!=NULL))
  {
    array_push($myNewArray, array($bufferArray[$count] => $_POST['numbers][$count]);
  }
  $count++;
}

让我知道这是否有帮助! :)


注意:我对代码进行了一些编辑。

此外,我以前的代码检查空数组空间是否为 NULL。如果要检查它们是 NULL 还是 "(空),请将代码行替换为:

if (($bufferArray[$count]!=NULL)&&($_POST['numbers][$count]!=NULL)&&($bufferArray[$count]!="")&&($_POST['numbers][$count]!=""))
{...}