2016-04-21 61 views
4

我有两组来自$_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); 

     } 

    } 

但我似乎不能正确地过滤它,因为它给我的错误:

Warning: array_combine(): Both parameters should have an equal number of elements

+0

我们可以假定这两个阵列将始终具有相同的数,而且键将永远是数字? –

+0

是的,两个键都是数字,计数也是一样的,因为它们是成对的名字和数字。 – Alko

+0

@Alko我为每个答案都添加了一些相关评论。请仔细阅读该页面,了解可能对您和其他人有用的一些见解。 – mickmackusa

回答

3

如何使用array_filterARRAY_FILTER_USE_BOTH标志?

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

这是不可信的,因为'array_filter()'会杀死'0'键/值元素。 http://sandbox.onlinephpfunctions.com/code/3d5536ea2a35d83c12afd0c52ef2f3d03d7ec47d – mickmackusa

+0

我推荐这个微调:'var_export(array_filter(array_combine($ array1,$ array2),function($ value,$ key){ return $ key!== “”&& $ value!==“”; },ARRAY_FILTER_USE_BOTH));' – mickmackusa

0

将士以前的信息考虑在内:

both keys will be numeric and the count will be the same, since they come in pairs as names and numbers

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

此方法有多个语法错误。修复它们之后,它仍然会损坏输出,并且不会返回正确的结果。 Downvoted。在发布之前总是测试你的代码,这样你就不会混淆未来的读者,浪费他们的时间,或者让不知情的研究人员使用错误的代码。不良输出的工作演示:http://sandbox.onlinephpfunctions。com/code/128d6609efaa691a8ca02499316ff39370ec9028 – mickmackusa

1

如果两个阵列将具有相同的数,并且键将永远是数字,你可以做到以下几点:

$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

这个答案是'0'键&值“安全”和重复“数字”“安全”。如果那些'trim()'调用不在那里,我会称这个回答非常干净。对于这个问题的范围,'trim()'调用是不必要的。好答案。演示:http://sandbox.onlinephpfunctions.com/code/f0f517f82460b9efd27325bbd247ca912083dcbf – mickmackusa

3

这里有一个有趣的方式:

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

这是不可信的,因为'array_filter()'会杀死'0'值的元素。 – mickmackusa

+0

当$ _POST ['numbers']'中有重复的数字时,双翻转也会损坏输出。 http://sandbox.onlinephpfunctions.com/code/6fc1774f9ea5f804760ab0184c02a49b641e3aa8请改进/重写此答案,现在太多错了。 – mickmackusa

2
// 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); 
+0

这不可信,因为'array_filter()'会杀死'0'值元素。 – mickmackusa