【问题标题】:Is this possible for combining of two arrays in PHP? (part 2)这可以在 PHP 中组合两个数组吗? (第2部分)
【发布时间】:2016-11-25 07:27:25
【问题描述】:

这是我的问题的第二部分,following part 1

我有两个数组签署者和名称。 Signatories 和 Designations 数组有分隔符 "|",表示每个都有 1,2 个或更多的签名者,与指定相同,取决​​于分隔符的数量。如果元素在分隔符和其他数组中具有 1、2 或更多值,我想输出。它将产生另一个副本或克隆。像这样:

$signatories = array('Allan|Joshua|Ronald' , 'Robert|Mellisa' , 'Maria');

$designations = array('CEO|OIC' , 'CEO|COO|MANAGER' , 'MANAGER|OIC|COO');

我的预期输出:

***Array [0]***

Allan - CEO
Joshua - CEO
Ronald- CEO
Allan - OIC
Joshua - OIC
Ronald- OIC

***Array [1]***

Robert - CEO
Mellisa - CEO
Robert - COO
Mellisa - COO
Robert - MANAGER
Mellisa - MANAGER

***Array [2]***

Maria - MANAGER
Maria - OIC
Maria- COO

【问题讨论】:

  • 请注意,Stack Overflow 并不是您可以订购免费代码的地方。因此,对于您的两个问题,您会展示您尝试过的内容以及遇到的问题吗?

标签: php arrays


【解决方案1】:

一种功能性方法(如果从后面/自下而上阅读,则易于理解):

$signatories = array('Allan|Joshua|Ronald', 'Robert|Mellisa', 'Maria');
$designations = array('CEO|OIC','CEO|COO','MANAGER|OIC|COO');

$result = array_map(function ($names, $titles) {
  return call_user_func_array('array_merge', array_map(function ($name) use ($titles) {
    return array_map(function ($title) use ($name) {
      return $name . ' - ' . $title;
    }, explode('|', $titles));
  }, explode('|', $names)));
}, $signatories, $designations);

这会产生如下结果:

Array
(
    [0] => Array
        (
            [0] => Allan - CEO
            [1] => Allan - OIC
            [2] => Joshua - CEO
            [3] => Joshua - OIC
            [4] => Ronald - CEO
            [5] => Ronald - OIC
        )

    [1] => Array
        (
            [0] => Robert - CEO
            [1] => Robert - COO
            [2] => Mellisa - CEO
            [3] => Mellisa - COO
        )

    [2] => Array
        (
            [0] => Maria - MANAGER
            [1] => Maria - OIC
            [2] => Maria - COO
        )

)

本方案使用内置PHP函数解决问题:

  1. 首先,将两个数组与array_map“压缩”在一起。
  2. 然后,对于每个名称,它与对中的每个标题组合在一起。
  3. 最后,阵列被展平。

PHP 没有数组展平函数,这就是它的用途:

call_user_func_array('array_merge', $input);

你也可以考虑使用RecursiveIterator from SPL

【讨论】:

    【解决方案2】:
    <?php
    $signatories = array('Allan|Joshua|Ronald' , 'Robert|Mellisa' , 'Maria');
    
    $designations = array('CEO|OIC' , 'CEO|COO|MANAGER' , 'MANAGER|OIC|COO');
    
    if (count($signatories) > count($designations))
        Die("Sorry, but number of signatories is larger than number of designations, cannot continue.");
    
    $result = [];
    foreach ($signatories as $k => $v) {
        $subresult = [];
        $e = explode('|', $v);
        $e2 = explode('|', $designations[$k]);
        foreach ($e as $name) {
            foreach ($e2 as $designation) {
                $subresult[] = $name.' - '.$designation;    
            }
    
        }
        $result[] = $subresult;
    }
    
    echo "<pre>";
    var_dump($result);
    echo "</pre>";
    

    【讨论】:

      【解决方案3】:
      $signatories = array('Allan|Joshua|Ronald' , 'Robert|Mellisa' , 'Maria');
      
      $designations = array('CEO|OIC' , 'CEO|COO|MANAGER' , 'MANAGER|OIC|COO');
      
      foreach($signatories as $key=>$item){
          $itemSet = explode('|', $item);
          foreach($itemSet as $row){
              $desSet = explode('|', $designations[$key]);
              foreach($desSet as $pos){
                  echo $row." - ".$pos;
                  echo "<br/>";
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        您需要两个循环,并且可以使用相同的索引。

        $signatories = array('Allan|Joshua|Ronald', 'Robert|Mellisa', 'Maria');
        $designations = array('CEO|OIC', 'CEO|COO|MANAGER', 'MANAGER|OIC|COO');
        
        $cs = count($signatories);
        for ($i=0; $i<$cs; $i++) {
          $desigs = explode('|', $designations[$i]);
          $signas = explode('|', $signatories[$i]);
          foreach ($desigs as &$desig) {
            foreach ($signas as &$signa) {
              echo $signa.' - '.$desig.'<br>';
            }
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-11
          • 2021-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-10
          • 1970-01-01
          • 2021-04-03
          相关资源
          最近更新 更多