【问题标题】:How to assign values from one array to another for n times如何将一个数组中的值分配给另一个数组 n 次
【发布时间】:2014-06-24 03:36:21
【问题描述】:

我正在尝试制定谁在哪一天使用特定项目的时间表。

我有 2 个数组。 一个带日期的 & 另一个人的名字以及他们可以使用该物品的天数。

我已经设法使用它创建了日期数组。

function dateArray($from, $to, $value = NULL) {
    $begin = new DateTime($from);
    $end = new DateTime($to);
    $interval = DateInterval::createFromDateString('1 day');
    $days = new DatePeriod($begin, $interval, $end);

    $baseArray = array();
    foreach ($days as $day) {
        $dateKey = $day->format("d-m-Y");
        $baseArray[$dateKey] = $value;
    }

    return $baseArray;
}

$dates_array = dateArray('01-01-2014', '30-09-2014',true);

print_r($dates_array );

这给了我日期

Array
(
    [01-01-2014] => 1
    [02-01-2014] => 1
    [03-01-2014] => 1
    [04-01-2014] => 1
    [05-01-2014] => 1
    [06-01-2014] => 1
    [07-01-2014] => 1
    [08-01-2014] => 1
    [09-01-2014] => 1
and so on.
)

我有另一个名称数组,其中 name 作为 keydays 作为 value ,他们可以像这样使用该项目。

$names_array = array("name1" => "4", "name2" => "3", "name3" => "1");

现在我想根据这个人可以使用该项目的天数来为日期分配名称。 像这样。 我需要我的最终输出数组是这样的

Array
(
    [01-01-2014] => name1
    [02-01-2014] => name1
    [03-01-2014] => name1
    [04-01-2014] => name1
    [05-01-2014] => name2
    [06-01-2014] => name2
    [07-01-2014] => name2
    [08-01-2014] => name3
    [09-01-2014] => name1
and so on. notice name1 comes again 
)

所以我试图获得像上面这样的输出,但是我在 foreach 内的 while 循环中失败了。 到目前为止,我已经尝试过了。

function dateArray($from, $to, $value = NULL) {
    $begin = new DateTime($from);
    $end = new DateTime($to);
    $interval = DateInterval::createFromDateString('1 day');
    $days = new DatePeriod($begin, $interval, $end);

    $baseArray = array();
    foreach ($days as $day) {
        $dateKey = $day->format("d-m-Y");
        $baseArray[$dateKey] = $value;
    }

    return $baseArray;
}

$dates_array = dateArray('01-01-2014', '30-09-2014',true);

$names_array = array("name1" => "4", "name2" => "3", "name3" => "1");

print_r($dates_array );

$new_dates = array();

foreach($dates_array as $dates => $key){
//echo $dates;
    foreach ($names_array as $name => $days){

        while($days <= 1){
        $new_dates[$dates] = $name ;
        $days = $days - 1;
        }
    }
}

print_r($new_dates);

但我的最终数组是空的。

那我该如何解决呢?

【问题讨论】:

  • 这不是你的问题的一部分......但不会覆盖某些值吗?因为如果两个用户在同一天都有 $days
  • 这个想法是,名称应该设置为值,而日期作为键。如果 days = 1 那么它应该只指定一个名字,然后继续下一个名字。
  • 对不起,我还是不明白你想要达到什么目的。我在 PHP 沙箱中运行这个,它似乎只分配了 foreach 的最后一个值。因为显然它会覆盖。就像是什么决定了 name1 在您展示的示例中重复
  • 因为如果这一天总是

标签: php arrays datetime


【解决方案1】:

您可以使用MultipleIterator,以便在需要时循环第二个数组(名称):

$names_array = array();

// unwind the array values
foreach (array("name1" => "4", "name2" => "3", "name3" => "1") as $value => $freq) {
    for ($i = 0; $i < $freq; ++$i) {
        $names_array[] = $value;
    }
}

// attach both arrays
$m = new MultipleIterator;
$m->attachIterator(new ArrayIterator(array_keys($dates_array)));
$m->attachIterator(new InfiniteIterator(new ArrayIterator($names_array)));

// build final array
$result = array();
foreach ($m as $value) {
    $result[$value[0]] = $value[1];
}

【讨论】:

    【解决方案2】:

    应该是这样的……

    while($days <= 1){
        $new_dates[$dates] = $name ;
        $names_array[$name] = $days - 1;
    }
    

    【讨论】:

      【解决方案3】:

      嗨,你可以试试这个

      $dates_array = array_keys(dateArray('01-01-2014', '30-09-2014',true));
      $names_array = array("name1" => "4", "name2" => "3", "name3" => "1");
      $new_dates = array();
      
      $daysindex = 0;
      while($daysindex < count($dates_array)){
          foreach ($names_array as $name => $day){
              for($x = 0; $x<$day; $x++){
                  if(isset($dates_array[$daysindex])){
                  $new_dates[$dates_array[$daysindex]] = $name ;
              $daysindex++;
                  }
              }
          }
      }
      print_r($new_dates);
      

      【讨论】:

        【解决方案4】:
        $dates = dateArray('01-01-2014', '30-09-2014',true);  
        $names = array('name1' => 4,'name2' => 3,'name3' => 1);
        
        $count = current($names);
        $name = key($names);
        
        foreach($dates as &$value) {   
            $value = $name;
        
            //if we've displayed a name $count times, move to the next name
            if(--$count == 0) {
                //if we're at the end of $names, wrap around
                if(false === next($names)) {
                    reset($names);
                }
        
                $count = current($names);
                $name = key($names);        
            }
        }
        
        print_r($dates);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-07
          • 2018-08-22
          相关资源
          最近更新 更多