【问题标题】:Build an array from 3 arrays with PHP使用 PHP 从 3 个数组构建一个数组
【发布时间】:2015-12-10 19:41:38
【问题描述】:

我在构造数组时遇到了一些问题。

数组 A:

Array
(
    [0] => 2015-09-13
    [1] => 2015-09-14
    [2] => 2015-09-15
    [3] => 2015-09-16
    [4] => 2015-09-17
    [5] => 2015-09-18
    [6] => 2015-09-19
)

数组 B:

Array
(
    [0] => 1
    [1] => 8
)

数组 C:

Array
(
    [0] => Leaves-19
    [1] => Shifts-18
    [2] => Shifts-18
    [3] => Shifts-18
    [4] => Shifts-18
    [5] => Shifts-18
    [6] => Leaves-19
    [7] => Leaves-19
    [8] => Shifts-12
    [9] => Shifts-12
    [10] => Shifts-12
    [11] => Shifts-12
    [12] => Shifts-12
    [13] => Leaves-19
)

期望的最终输出:

Array
(
    [0] => 2015-09-13|1|Leaves-19
    [1] => 2015-09-14|1|Shifts-18
    [2] => 2015-09-15|1|Shifts-18
    [3] => 2015-09-16|1|Shifts-18
    [4] => 2015-09-17|1|Shifts-18
    [5] => 2015-09-18|1|Shifts-18
    [6] => 2015-09-19|1|Leaves-19
    [7] => 2015-09-13|8|Leaves-19
    [8] => 2015-09-14|8|Shifts-12
    [9] => 2015-09-15|8|Shifts-12
    [10] => 2015-09-16|8|Shifts-12
    [11] => 2015-09-17|8|Shifts-12
    [12] => 2015-09-18|8|Shifts-12
    [13] => 2015-09-19|8|Leaves-19
)

我迷失在forforeach

逻辑如下:

  • 1st parameter 是一个日期,它的形式是 array B。这是重复 6 个条目后。
  • 2nd parameter 是用户 ID。它在 6 个条目后更改并传递到下一个 id。
  • 3rd parameterarray B 的一个条目。

其他信息:

  • 数组的长度不同。
  • Array A,共有 6 个条目。
  • Array B,统计一个随机条目。
  • Array C,是Array A x 2。

我已经尝试为我的array B 创建一个for,并在array A 中进行了一次foreach,但它不起作用。

我不知道我需要从哪里开始。

希望我能得到任何帮助或提示。

非常感谢。

【问题讨论】:

  • 您需要解释数组之间如何关联的逻辑,以及到目前为止您实际尝试过的内容。 “我不知道我需要从哪里开始”并不是一项真正的研究工作。
  • 数组 C 是否总是与最终数组的长度相同?最终数组的长度是否总是count(A) * count(B)
  • @rjdown:问题已编辑。希望它会有所帮助。
  • 数组大小会保持不变吗??

标签: php arrays for-loop each


【解决方案1】:

试试这段代码,我已将您的 3 个数组命名为 $arrA$arrB$arrC

$arrA = Array(
  '2015-09-13',
  '2015-09-14',
  '2015-09-15',
  '2015-09-16',
  '2015-09-17',
  '2015-09-18',
  '2015-09-19'
);
$arrB = array(1,8);
$arrC  = array(
  'Leaves-19',
  'Shifts-18',
  'Shifts-18',
  'Shifts-18',
  'Shifts-18',
  'Shifts-18',
  'Leaves-19',
  'Leaves-19',
  'Shifts-12',
  'Shifts-12',
  'Shifts-12',
  'Shifts-12',
  'Shifts-12',
  'Leaves-19'
);

$output = array();
$indx = 0;
foreach($arrB as $b){
    foreach($arrA as $a){
        $output[] = $a.'|'.$b.'|'.$arrC[$indx];
        $indx++;/*new line addded*/
    }
    //$indx++;/*remove this line from here*/
}

echo "<pre>";
print_r($output);
echo "</pre>";

【讨论】:

  • 你认为数组 C 每一步都会递增吗?
  • 第三个参数的例外情况并非如此。
  • 第三个参数Shifts-12在哪里。 :(
【解决方案2】:

你可以使用modulus operator

$OutputArray = Array();

for($i=0; $i < max(count($a1),count($a2),count($a3)); $i++){
  array_push($OutputArray, $a1[ $i % count($a1) ] . "|" . 
             $a2[ $i % count($a2) ] . "|" . $a3[ $i % count($a3) ]);
}

print_r($OutputArray);

你得到:

大批 ( [0] => 2015-09-13|1|Leaves-19 [1] => 2015-09-14|8|Shifts-18 [2] => 2015-09-15|1|Shifts-18 [3] => 2015-09-16|8|Shifts-18 [4] => 2015-09-17|1|Shifts-18 [5] => 2015-09-18|8|Shifts-18 [6] => 2015-09-19|1|Leaves-19 [7] => 2015-09-13|8|Leaves-19 [8] => 2015-09-14|1|班次-12 [9] => 2015-09-15|8|Shifts-12 [10] => 2015-09-16|1|班次-12 [11] => 2015-09-17|8|Shifts-12 [12] => 2015-09-18|1|班次-12 [13] => 2015-09-19|8|Leaves-19 )

如果你想按顺序(预期):

$OutputArray = Array();

$max = max(count($a1),count($a2),count($a3));
for($i=0; $i < $max; $i++){
  array_push($OutputArray, $a1[$i%count($a1)] . "|" . 
             $a2[ $i*count($a2) / $max ] . "|" . $a3[$i%count($a3)]);
}

print_r($OutputArray);

你得到:

大批 ( [0] => 2015-09-13|1|Leaves-19 [1] => 2015-09-14|1|Shifts-18 [2] => 2015-09-15|1|Shifts-18 [3] => 2015-09-16|1|Shifts-18 [4] => 2015-09-17|1|Shifts-18 [5] => 2015-09-18|1|Shifts-18 [6] => 2015-09-19|1|Leaves-19 [7] => 2015-09-13|8|Leaves-19 [8] => 2015-09-14|8|Shifts-12 [9] => 2015-09-15|8|Shifts-12 [10] => 2015-09-16|8|Shifts-12 [11] => 2015-09-17|8|Shifts-12 [12] => 2015-09-18|8|班次-12 [13] => 2015-09-19|8|Leaves-19 )

【讨论】:

  • 它似乎没有做 OP 在 Array B 部分需要的东西。
  • @AlanMachado 实际上确实如此,只是以不同的排序顺序获得相同的值。
  • 看起来可行。只有一件事:我通常必须有 13 个条目。用你的代码我编码 14。所以我只删除等号。
  • 这是一个很好的算法,先生!我也在朝着类似的方向努力,但你可以打字更快!大声笑。
  • @ABC 您问题中所需的输出显示 14 个元素!如果可以的话,我会再次投票赞成这个答案!
【解决方案3】:

这很臭homework problem,所以我将用伪代码回答,希望你能应用一些提示并自己找到解决方案。

似乎 Array B ([1,8]) 是开始打印下一个索引的索引列表。根据您想要的最终输出,您自己的声明 (2nd parameter is the user id. It changes after 6 entries and pass to the next id.) 并不准确:

[6] => 2015-09-19|1|Leaves-19
[7] => 2015-09-13|8|Leaves-19

这将移动到索引 7(计数 8)处的下一个 id,而不是索引 6(计数 7,或 6 个条目之后的一个)。

所以我的伪解决方案是这样的:

  • 通过重复数组 A 直到它与数组 C 的长度匹配来创建一个新数组
  • 通过查找数组B中等于或小于(1+index)的元素,将数组B追加到数组A:

    0 =&gt; '1', 1 =&gt; '1' ... 7 =&gt; '8'

  • 将数组 C 连接到具有索引奇偶校验的每个数组(例如,newArray[ 0 ] . ArrayC[ 0 ]

这将为您提供所需的最终输出。

【讨论】:

    【解决方案4】:

    试试这个,它会遍历最大的数组,并将次要数组的计数设置为所需的列表行为。

    <?php
    
    $arrA = ['2015-09-13','2015-09-14','2015-09-15','2015-09-16',
            '2015-09-17','2015-09-18','2015-09-19'];
    $arrB = [1,8];
    $arrC = ['Leaves-19','Shifts-18','Shifts-18','Shifts-18','Shifts-18','Shifts-18',
    'Leaves-19','Leaves-19','Shifts-12','Shifts-12','Shifts-12','Shifts-12','Shifts-12',
    'Leaves-19'];
    $a = $b = 0;
    
    for ($c = 0; $c < count($arrC); $c++) {
        $arrC[$c] = $arrA[$a].'|'.$arrB[$b].'|'.$arrC[$c];
        $a++;
        if ($a == count($arrA)) {
            $a = 0;
            $b++;
        }
    };
    
    echo "<pre>";
    print_r($arrC);
    

    输出:

    Array
    (
        [0] => 2015-09-13|1|Leaves-19
        [1] => 2015-09-14|1|Shifts-18
        [2] => 2015-09-15|1|Shifts-18
        [3] => 2015-09-16|1|Shifts-18
        [4] => 2015-09-17|1|Shifts-18
        [5] => 2015-09-18|1|Shifts-18
        [6] => 2015-09-19|1|Leaves-19
        [7] => 2015-09-13|8|Leaves-19
        [8] => 2015-09-14|8|Shifts-12
        [9] => 2015-09-15|8|Shifts-12
        [10] => 2015-09-16|8|Shifts-12
        [11] => 2015-09-17|8|Shifts-12
        [12] => 2015-09-18|8|Shifts-12
        [13] => 2015-09-19|8|Leaves-19
    )
    

    【讨论】:

      【解决方案5】:

      我的版本:

      $arrayA = array('2015-09-13','2015-09-14','2015-09-15','2015-09-16','2015-09-17','2015-09-18','2015-09-19');
      $arrayB = array(1,8);
      $arrayC = array('Leaves-19','Leaves-18','Leaves-17','Leaves-16','Leaves-15','Leaves-14','Leaves-13','Leaves-12','Leaves-11','Leaves-10','Leaves-9','Leaves-8','Leaves-7','leaves-6');
      $output = array();
      $count = 0;
      
      foreach($arrayB as $arrayBElement){
          foreach($arrayA as $arrayAElement){
              $output[] = $arrayC[$count] . '|' . $arrayAElement . '|' . $arrayBElement;
              $count++;
          }
      }
      
      var_dump($output);
      

      E: 删除错误计数

      【讨论】:

      • 编辑并保留数组C在最后,B在中间,A在开始
      【解决方案6】:

      用不同的尺寸尝试猜测最大长度

      //Create arrays
      var Adates= ["2015-09-13", "2015-09-14", "2015-09-15"];
      var Bnums= ["1", "2", "3"];
      var Cnums= ["Leaves-19", "Shifts-18", "Shifts-18"];
      
      //get size
      var maxLenght=0;
      if(Adates.length>maxLenght) maxLenght=Adates.length;
      if(Bnums.length>maxLenght) maxLenght=Bnums.length;
      if(Cnums.length>maxLenght) maxLenght=Cnums.length;
      
      //merge and populate
      var OutputArray;
      for (i = 0; i < maxLenght; i++) {
            OutputArray[i]=Adates[i]+"|"+Bnums[i]+"|"+Cnums[i];
      }
      

      【讨论】:

      • 这是javascript吗?我相信 OP 的目标是 PHP。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 2013-08-21
      • 2021-06-24
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      相关资源
      最近更新 更多