【问题标题】:Form an array list in the another format using PHP使用 PHP 形成另一种格式的数组列表
【发布时间】:2022-01-06 09:16:45
【问题描述】:

我有一个像 $aa 这样的关联数组格式。需要形成不同格式的数组列表。

$aa = Array
 (
'Std'=> Array
    (
         'Add/Remove/Modify',
         'Create',
         'Addition',
         'repository',
    ),

'Agl' => Array
    (
         'Disk',
         'center',
         'Service ',
    ),

'Error' => Array
    (
         'VM',
         'DNS',
         'Upgrade',
    ),

'Hyg' => Array
    (
       'Health',
        'VM ',
        'Clear',
    ),

'Int' => Array
    (
         'iExecute',
         'Storage',
         'CMDB',
    ),

'Jor' => Array
    (
         'Uptime ',
         'Server ',
        'Report',
    ),

'Mon' => Array
    (
         'jobs',
         'mon',
         'SLA',
    ),

);

必须在 PHP 中形成如下格式的数组。 帮我解决这个问题。提前致谢

$res = array( 
    array( 
            'Add/Remove/Modify','Disk', 'VM','Health', 'iExecute','Uptime ', 'jobs'
    ),
    array(
        'Create','center', 'DNS', 'VM ','Storage','Server ', 'mon'
    ),
    array(
        'Addition', 'Service ', 'Upgrade', 'Clear', 'CMDB', 'Report','SLA'
    ),
    array('repository')
    ); 

【问题讨论】:

  • 结果应该是这样的。 1) 第 0 列的 $aa 数组是 $res 数组的第一个数组('Add/Remove/Modify','Disk', 'VM','Health', 'iExecute','Uptime', 'jobs'), 2 ) 第 1 列的 $aa 数组是 $res 数组的第二个数组('Create','center', 'DNS', 'VM','Storage','Server', 'mon'), 3) $aa 数组第二列是 $res 数组的第三个数组('Addition', 'Service', 'Upgrade', 'Clear', 'CMDB', 'Report','SLA' ), 4) $aa 第三列的数组是第四个数组$res 数组('repository')
  • 循环$aa['Std'],并通过相应的索引(如果存在)访问其他子数组中的项目。

标签: php arrays


【解决方案1】:

array_column 应该可以帮助您。如果您知道可以在其中一个数组中拥有的最大项目数,则无需像我在这里所做的那样找到最大值。

$array = [
    'a' => [
        '1.1',
        '1.2',
        '1.3',
        '1.4',
    ],
    'b' => [
        '2.1',
        '2.2',
        '2.3',
        '2.4',
        '2.5',
    ],
    'c' => [
        '3.1',
        '3.2',
        '3.3',
    ],
];

$max_items = 0;
foreach ($array as $sub) {
    $count = count($sub);
    if ($count > $max_items) {
        $max_items = $count;
    }
}

$new_array = [];
for ($i = 0; $i < $max_items; $i++) {
    $new_array[] = array_column(array_values($array), $i);
} 

var_dump($new_array);

结果

array(5) {
  [0]=>
  array(3) {
    [0]=>
    string(3) "1.1"
    [1]=>
    string(3) "2.1"
    [2]=>
    string(3) "3.1"
  }
  [1]=>
  array(3) {
    [0]=>
    string(3) "1.2"
    [1]=>
    string(3) "2.2"
    [2]=>
    string(3) "3.2"
  }
  [2]=>
  array(3) {
    [0]=>
    string(3) "1.3"
    [1]=>
    string(3) "2.3"
    [2]=>
    string(3) "3.3"
  }
  [3]=>
  array(2) {
    [0]=>
    string(3) "1.4"
    [1]=>
    string(3) "2.4"
  }
  [4]=>
  array(1) {
    [0]=>
    string(3) "2.5"
  }
}

【讨论】:

    【解决方案2】:

    您可以首先使用 max 和 array_map 获取内部数组之一中的最大列数。然后,您可以通过array_column 获取每个单独的列,该列也采用整数键作为索引。

    $result = [];
    $maxNumberOfColumns = max(array_map('count', $aa));
    
    for ($i = 0; $i < $maxNumberOfColumns; $i++) {
        $result[] = array_column($aa, $i);
    }
    
    echo '<pre>', print_r($result, true), '</pre>';
    

    结果:

    (
        [0] => Array
            (
                [0] => Add/Remove/Modify
                [1] => Disk
                [2] => VM
                [3] => Health
                [4] => iExecute
                [5] => Uptime 
                [6] => jobs
            )
    
        [1] => Array
            (
                [0] => Create
                [1] => center
                [2] => DNS
                [3] => VM 
                [4] => Storage
                [5] => Server 
                [6] => mon
            )
    
        [2] => Array
            (
                [0] => Addition
                [1] => Service 
                [2] => Upgrade
                [3] => Clear
                [4] => CMDB
                [5] => Report
                [6] => SLA
            )
    
        [3] => Array
            (
                [0] => repository
            )
    
    )
    

    【讨论】:

      【解决方案3】:

      此解决方案使用两个循环,第一个帮助我们确定 $res 数组的最大长度,而第二个循环遍历每个值以填充 $res 子数组。

      $res = [];
      $len_arr = [];
      
      // Figure out the length of the $res array
      foreach ($aa as $key => $value) {
          array_push($len_arr, count($value));
      }
      
      //Populate the $res array with $len number of empty arrays
      $len = max($len_arr);
      $res = array_fill(0, $len, []);
      
      //Loop through each array to populate the inner array of the $res array
      foreach ($aa as $key => $value) {
          for ($i = 0; $i < count($value); $i++) {
              array_push($res[$i], $value[$i]);
          }
      }
      
      echo '<pre>', print_r($res, true), '</pre>';
      

      打印$res的结果如下图:

      Array
      (
          [0] => Array
              (
                  [0] => Add/Remove/Modify
                  [1] => Disk
                  [2] => VM
                  [3] => Health
                  [4] => iExecute
                  [5] => Uptime 
                  [6] => jobs
              )
      
          [1] => Array
              (
                  [0] => Create
                  [1] => center
                  [2] => DNS
                  [3] => VM 
                  [4] => Storage
                  [5] => Server 
                  [6] => mon
              )
      
          [2] => Array
              (
                  [0] => Addition
                  [1] => Service 
                  [2] => Upgrade
                  [3] => Clear
                  [4] => CMDB
                  [5] => Report
                  [6] => SLA
              )
      
          [3] => Array
              (
                  [0] => repository
              )
      
      )
      

      我希望你觉得这很有用。

      【讨论】:

        【解决方案4】:

        array_map() 将任意数量的数组作为参数(它可以比使用一个数组的“标准情况”做更多的事情),然后一次遍历一个元素。每个数组的当前元素的“集合”(数组)被传递给一个回调函数,该函数可以按照您希望它们的方式“塑造”每组值(这就是它们被传递的方式)到回调,在这种情况下:))。

        这只是一些数组比其他数组长的小问题(在这种情况下,传递给回调的集合大小仍然相同,但较短数组的值为空)。因此调用array_filter()

        您现在可能已经知道,讲述“倒退”的故事,我们将 $aa 的内容 - 作为单独的数组 - 传递给 array_map(),借助 the spread operator(“外部”之一,函数头中的扩展运算符将所有参数压缩到数组$args)。要解压数组 PHP 希望它是数字的,$aa 不是。因此array_values()

        print_r(
            array_map(
                function(...$args) {
                    return array_filter($args);
                },
                ...array_values($aa)
            )
        );
        

        【讨论】:

          猜你喜欢
          • 2014-04-05
          • 2020-12-27
          • 2021-05-13
          • 1970-01-01
          • 1970-01-01
          • 2018-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多