2016-04-21 102 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