【问题标题】:Combine post values and remove empty合并帖子值并删除空白
【发布时间】:2016-04-21 20:37:24
【问题描述】:

我有两组来自$_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():两个参数应该有相同数量的元素

【问题讨论】:

  • 我们可以假设两个数组总是有相同的计数,并且键总是数字吗?
  • 是的,两个键都是数字,而且计数相同,因为它们以名称和数字的形式成对出现。
  • @Alko 我为每个答案添加了一些相关的 cmets。请查看页面,了解一些可能对您和其他人有教育意义的见解。

标签: php arrays post


【解决方案1】:

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)
}
*/

【讨论】:

  • 这是不可信的,因为array_filter() 将杀死0 键控/值元素。 sandbox.onlinephpfunctions.com/code/…
  • 我建议稍微调整一下:var_export(array_filter(array_combine($array1, $array2), function($value, $key) { return $key!=="" &amp;&amp; $value!==""; }, ARRAY_FILTER_USE_BOTH));
【解决方案2】:

这是一个有趣的方式:

$result = array_flip(array_flip(array_filter(array_combine($_POST['names'],
                                                           $_POST['numbers']))));

【讨论】:

  • 这是不可信的,因为array_filter() 会杀死0 有价值的元素。
  • $_POST['numbers']中有重复数字时,双重翻转也会损坏输出。 sandbox.onlinephpfunctions.com/code/…请改进/重写这个答案,现在错太多了。
【解决方案3】:
// 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);

【讨论】:

  • 这是不可信的,因为array_filter() 会杀死0 有价值的元素。
【解决方案4】:

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

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

【讨论】:

  • 这个答案是0 key & value "safe" 和重复 numbers "safe"。如果那些trim() 电话不在那里,我会称这个答案非常干净。对于这个问题的范围,trim() 调用不是必需的。好答案。演示:sandbox.onlinephpfunctions.com/code/…
【解决方案5】:

考虑您以前的信息:

两个键都是数字,计数相同,因为它们以名称和数字的形式成对出现

$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]!=""))
{...}

【讨论】:

  • 这个方法有多个语法错误。修复它们后,它仍然会破坏输出并且无法接近返回正确的结果。否决。总是在发布之前测试你的代码,这样你就不会混淆未来的读者,浪费他们的时间,或者欺骗毫无戒心的研究人员使用糟糕的代码。错误输出的工作演示:sandbox.onlinephpfunctions.com/code/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
相关资源
最近更新 更多