2017-07-17 71 views
0

我有兩個陣列,第一個是保存用戶基本的詳細信息,如用戶類型,用戶加入日期&積分如何以編程方式向另一個陣列添加陣列數據

// User data array 
$data = array(array('0' => 'New User', '1' => '2017-07-10', '2' => '12'), array('0' => 'New User', '1' => '2017-07-11', '2' => '6'), array('0' => 'New User', '1' => '2017-07-13', '2' => '19')); 

// Output: 
Array 
(
    [0] => Array 
     (
      [0] => New User 
      [1] => 2017-07-10 
      [2] => 12 
     ) 

    [1] => Array 
     (
      [0] => New User 
      [1] => 2017-07-11 
      [2] => 6 
     ) 

    [2] => Array 
     (
      [0] => New User 
      [1] => 2017-07-13 
      [2] => 19 
     ) 

) 

,第二個是星期日期數組:

// Dates array 
$datesArr = array('0' => '2017-07-10', '1' => '2017-07-11', '2' => '2017-07-12', '3' => '2017-07-13', '4' => '2017-07-14', '5' => '2017-07-15', '6' => '2017-07-16', '7' => '2017-07-17'); 

// Output: 
Array 
(
    [0] => 2017-07-10 
    [1] => 2017-07-11 
    [2] => 2017-07-12 
    [3] => 2017-07-13 
    [4] => 2017-07-14 
    [5] => 2017-07-15 
    [6] => 2017-07-16 
    [7] => 2017-07-17 
) 

現在我要添加從$datesArr陣列中丟失了用戶$data陣列日期。

例如下面的日期丟失:

$data = array(array('0' => 'New User', '1' => '2017-07-12', '2' => '0'), array('0' => 'New User', '1' => '2017-07-14', '2' => '0'), array('0' => 'New User', '1' => '2017-07-15', '2' => '0'), array('0' => 'New User', '1' => '2017-07-16', '2' => '0'), array('0' => 'New User', '1' => '2017-07-17', '2' => '0')); 

Array 
(
    [0] => Array 
     (
      [0] => New User 
      [1] => 2017-07-12 
      [2] => 0 
     ) 

    [1] => Array 
     (
      [0] => New User 
      [1] => 2017-07-14 
      [2] => 0 
     ) 

    [2] => Array 
     (
      [0] => New User 
      [1] => 2017-07-15 
      [2] => 0 
     ) 

    [3] => Array 
     (
      [0] => New User 
      [1] => 2017-07-16 
      [2] => 0 
     ) 

    [4] => Array 
     (
      [0] => New User 
      [1] => 2017-07-17 
      [2] => 0 
     ) 

) 

,我期待這樣的輸出:

Array 
(
    [0] => Array 
     (
      [0] => New User 
      [1] => 2017-07-10 
      [2] => 12 
     ) 

    [1] => Array 
     (
      [0] => New User 
      [1] => 2017-07-11 
      [2] => 6 
     ) 

    [2] => Array 
     (
      [0] => New User 
      [1] => 2017-07-12 
      [2] => 0 
     ) 

    [3] => Array 
     (
      [0] => New User 
      [1] => 2017-07-13 
      [2] => 12 
     ) 

    [4] => Array 
     (
      [0] => New User 
      [1] => 2017-07-14 
      [2] => 0 
     ) 

    [5] => Array 
     (
      [0] => New User 
      [1] => 2017-07-15 
      [2] => 0 
     ) 

    [6] => Array 
     (
      [0] => New User 
      [1] => 2017-07-16 
      [2] => 0 
     ) 

    [7] => Array 
     (
      [0] => New User 
      [1] => 2017-07-17 
      [2] => 0 
     ) 

) 

不知道如何從一個陣列添加缺少的日期到另一個?

謝謝。

回答

0

訣竅是使用日期字符串作爲數組鍵:

<?php 
$users = [ 
    ['New User', '2017-07-10', 12], 
    ['New User', '2017-07-11', 6], 
    ['New User', '2017-07-13', 19] 
]; 
$dates = [ 
    '2017-07-10', 
    '2017-07-11', 
    '2017-07-12', 
    '2017-07-13', 
    '2017-07-14', 
    '2017-07-15', 
    '2017-07-16', 
    '2017-07-17' 
]; 
$output = []; 
// create new users array with dates as keys 
array_walk($users, function($user) use (&$output) { 
    $output[$user[1]] = $user; 
}); 
// iterate over dates array to fill in as requred 
array_walk($dates, function($date) use (&$output) { 
    if (!array_key_exists($date, $output)) { 
     $output[$date] = ['New User', $date, 0]; 
    } 
}); 
print_r(array_values($output)); 

輸出顯然是:

Array 
(
    [0] => Array 
     (
      [0] => New User 
      [1] => 2017-07-10 
      [2] => 12 
     ) 

    [1] => Array 
     (
      [0] => New User 
      [1] => 2017-07-11 
      [2] => 6 
     ) 

    [2] => Array 
     (
      [0] => New User 
      [1] => 2017-07-13 
      [2] => 19 
     ) 

    [3] => Array 
     (
      [0] => New User 
      [1] => 2017-07-10 
      [2] => 0 
     ) 

    [4] => Array 
     (
      [0] => New User 
      [1] => 2017-07-11 
      [2] => 0 
     ) 

    [5] => Array 
     (
      [0] => New User 
      [1] => 2017-07-12 
      [2] => 0 
     ) 

    [6] => Array 
     (
      [0] => New User 
      [1] => 2017-07-13 
      [2] => 0 
     ) 

    [7] => Array 
     (
      [0] => New User 
      [1] => 2017-07-14 
      [2] => 0 
     ) 

    [8] => Array 
     (
      [0] => New User 
      [1] => 2017-07-15 
      [2] => 0 
     ) 

    [9] => Array 
     (
      [0] => New User 
      [1] => 2017-07-16 
      [2] => 0 
     ) 

    [10] => Array 
     (
      [0] => New User 
      [1] => 2017-07-17 
      [2] => 0 
     ) 

) 
+0

感謝您的支持。我已經嘗試過你的邏輯,但是一些日期正在像'2017-07-10,2017-07-11,2017-07-13'這樣的數組中重複。 –

+0

@Mr。快樂對不起,我的錯,顯然我在第一次迭代中使用了錯誤的索引,'2'代替了'1'!在上面的代碼中修復。 – arkascha

0

希望這會有所幫助,這裏我們使用array_columnforeach實現期望的輸出。

Try this code snippet here

<?php 
ini_set('display_errors', 1); 
$data = array(
    array('0' => 'New User', '1' => '2017-07-10', '2' => '12'), 
    array('0' => 'New User', '1' => '2017-07-11', '2' => '6'), 
    array('0' => 'New User', '1' => '2017-07-13', '2' => '19')); 
$datesArr = array(
    '0' => '2017-07-10', 
    '1' => '2017-07-11', 
    '2' => '2017-07-12', 
    '3' => '2017-07-13', 
    '4' => '2017-07-14', 
    '5' => '2017-07-15', 
    '6' => '2017-07-16', 
    '7' => '2017-07-17'); 

$datesPresent=array_column($data, 1); 
$result=array(); 
foreach($datesArr as $date) 
{ 
    if(!in_array($date, $datesPresent)) 
    { 
     $result[]=array('New User',$date,0); 
    } 
    else 
    { 
     $result[]=current($data); 
     next($data); 
    } 
} 
print_r($result); 
0

你需要這樣的東西嗎?

<?php 
$data = array(array('0' => 'New User', '1' => '2017-07-10', '2' => '12'), array('0' => 'New User', '1' => '2017-07-11', '2' => '6'), array('0' => 'New User', '1' => '2017-07-13', '2' => '19')); 

$datesArr = array('0' => '2017-07-30', '1' => '2017-07-11', '2' => '2017-07-12', '3' => '2017-07-13', '4' => '2017-07-14', '5' => '2017-07-15', '6' => '2017-07-16', '7' => '2017-07-17'); 

$new_array = array(); 
foreach($datesArr as $date) 
{ 
    foreach($data as $d) 
    { 
     if($date == $d[1]) 
     { 
      $temp = $d; 
      break; 
     } 
    } 

    $temp = !isset($temp) ? array('0' => 'New User','1' => $date,'2' => 0) : $temp; 
    $new_array[] = $temp; 
} 

var_dump($new_array); 
0

我會盡量在這裏使用array_search:

$data = array(array('0' => 'New User', '1' => '2017-07-10', '2' => '12'), array('0' => 'New User', '1' => '2017-07-11', '2' => '6'), array('0' => 'New User', '1' => '2017-07-13', '2' => '19')); 
$datesArr = array('0' => '2017-07-10', '1' => '2017-07-11', '2' => '2017-07-12', '3' => '2017-07-13', '4' => '2017-07-14', '5' => '2017-07-15', '6' => '2017-07-16', '7' => '2017-07-17'); 

$newData = array(); 
foreach ($datesArr as $value) { 
    $key = array_search($value, array_column($data, 1)); 
    if ($key===false) { 
    $newData[]=array('0' => 'New User', '1' => $value, '2' => 0); 
    }else{ 
    $newData[]=$data[$key]; 
    } 
} 
print_r($newData); 
0

這是基於函數的,自由狀態,加工方法,在短短兩行。

$defaults使用的日期從$datesArr以產生在每個子陣列的日期作爲鍵,和子陣列的陣列與New User,相應的日期,並0

$merged使用array_merge()覆蓋基於鍵(日期)默認的子陣列,則array_values()重新索引子陣列(去除所述臨時日期鍵)。

代碼:(Demo

$data=[ 
    ['0'=>'New User','1'=>'2017-07-10','2'=>'12'], 
    ['0'=>'New User','1'=>'2017-07-11','2'=>'6'], 
    ['0'=>'New User','1'=>'2017-07-13','2'=>'19'] 
]; 
$datesArr=[ 
    '0'=>'2017-07-10', 
    '1'=>'2017-07-11', 
    '2'=>'2017-07-12', 
    '3'=>'2017-07-13', 
    '4'=>'2017-07-14', 
    '5'=>'2017-07-15', 
    '6'=>'2017-07-16', 
    '7'=>'2017-07-17' 
]; 

$defaults=array_combine($datesArr,array_map(function($v){return ['New User',$v,'0'];},$datesArr)); // set default values 
$merged=array_values(array_merge($defaults,array_column($data,null,1))); // array_column re-assigns keys using dates 
var_export($merged); 

輸出:

array (
    0 => 
    array (
    0 => 'New User', 
    1 => '2017-07-10', 
    2 => '12', 
), 
    1 => 
    array (
    0 => 'New User', 
    1 => '2017-07-11', 
    2 => '6', 
), 
    2 => 
    array (
    0 => 'New User', 
    1 => '2017-07-12', 
    2 => '0', 
), 
    3 => 
    array (
    0 => 'New User', 
    1 => '2017-07-13', 
    2 => '19', 
), 
    4 => 
    array (
    0 => 'New User', 
    1 => '2017-07-14', 
    2 => '0', 
), 
    5 => 
    array (
    0 => 'New User', 
    1 => '2017-07-15', 
    2 => '0', 
), 
    6 => 
    array (
    0 => 'New User', 
    1 => '2017-07-16', 
    2 => '0', 
), 
    7 => 
    array (
    0 => 'New User', 
    1 => '2017-07-17', 
    2 => '0', 
), 
)