列中分隔的字符串的PHP数组到关联数组[重复]

Posted

技术标签:

【中文标题】列中分隔的字符串的PHP数组到关联数组[重复]【英文标题】:PHP array of strings seperated in columns to associative array [duplicate] 【发布时间】:2016-05-05 01:16:48 【问题描述】:

我有 unix 磁盘输出,我想将其转换为每行的关联数组,以便用户可以选择可用磁盘以用于下一次 vg 创建。

当前数组项的输出。每列之间只有 1 个空格,我只是做了一些制表符,所以更容易阅读。

array(11)  
[0]=> string(141) "vg1              LVM  136G   /dev/cciss/c0d0p2        N/A                               N/A       LOCAL N/A  N/A     NO " 
[1]=> string(141) "vg2              LVM  1G     /dev/mapper/mpath28p1   60060e80166fa70000016fa700000013 /dev/dm-33 R700    LS1000  0013    YES " 
[2]=> string(141) "vg3              LVM  60G    /dev/mapper/mpath27p1 60060e80166fa70000016fa700000012 /dev/dm-34 R700  LS1000  0012    YES " 
[3]=> string(141) "vg4              LVM  60G    /dev/mapper/mpath29p1 60060e80166fa70000016fa700000014 /dev/dm-35 R700  LS1000  0014    NO " 
[4]=> string(141) "***AVAILABLE***  FREE 2G     /dev/mapper/mpath21p1 60060e80167220000001722000000048 /dev/dm-37 R700  LS2000  0048    YES " 
[5]=> string(141) "***AVAILABLE***  FREE 2G     /dev/mapper/mpath22p1 60060e80167220000001722000000049 /dev/dm-36 R700  LS2000  0049    YES " 
[6]=> string(141) "***AVAILABLE***  FREE 90G    /dev/mapper/mpath23p1 60060e80166fa70000016fa70000000e /dev/dm-31 R700  LS1000  000e    YES " 
[7]=> string(141) "***AVAILABLE***  FREE 90G    /dev/mapper/mpath24p1 60060e80166fa70000016fa70000000f /dev/dm-39 R700  LS1000  000f    YES " 
[8]=> string(141) "***AVAILABLE***  FREE 90G    /dev/mapper/mpath25p1 60060e80166fa70000016fa700000010 /dev/dm-30 R700  LS1000  0010    YES " 
[9]=> string(141) "***AVAILABLE***  FREE 90G    /dev/mapper/mpath26p1 60060e80166fa70000016fa700000011 /dev/dm-32 R700  LS1000  0011    YES " 
[10]=> string(141) "***AVAILABLE*** FREE 2G     /dev/mapper/mpath30p1 60060e80167220000001722000000047 /dev/dm-38 R700  LS2000  0047    YES " 

我希望它以这样的方式结束。我一直在尝试不同的 foreach 循环,但还没有让它工作。感谢您提供任何帮助/建议。

[0] => name=>vg1 type=>LVM lun_size=>136G  mpath_name=>/dev/cciss/c0d0p2  flun_id=>N/A  dm_name=>N/A  array_type=>LOCAL  array_name=>N/A  lun_id=>N/A  shared=>NO
[1] => name=>vg2 type=>LVM lun_size=>1G  mpath_name=>//dev/mapper/mpath28p1  flun_id=>60060e80166fa70000016fa700000013  dm_name=>/dev/dm-33  array_type=>R700  array_name=>LS1000  lun_id=>0013  shared=>NO
[2] => ....etc

谢谢

【问题讨论】:

【参考方案1】:

解决办法是:

循环遍历原始数组元素 使用explode()函数拆分字符串 将(键,值)对中的元素存储在临时数组中 将临时数组推送到原始数组中的适当位置。

所以你的代码应该是这样的:

// suppose $arr is your original array
$arrLength = count($arr);
for($i = 0; $i < $arrLength; ++$i)
    $component_arr = explode(" ", $arr[$i]);
    $tmp_arr = array();
    $tmp_arr['name'] = $component_arr[0];
    $tmp_arr['type'] = $component_arr[1];
    $tmp_arr['lun_size'] = $component_arr[2];
    $tmp_arr['mpath_name'] = $component_arr[3];
    $tmp_arr['flun_id'] = $component_arr[4];
    $tmp_arr['dm_name'] = $component_arr[5];
    $tmp_arr['array_type'] = $component_arr[6];
    $tmp_arr['array_name'] = $component_arr[7];
    $tmp_arr['lun_id'] = $component_arr[8];
    $tmp_arr['shared'] = $component_arr[9];

    unset($arr[$i]);
    $arr[$i] = $tmp_arr;


// display $arr array
var_dump($arr);

【讨论】:

我在每列之间确实有差异空间。取决于列的长度。首先通过使所有空格 = 1 来解决这个问题。然后只需要修剪每行的尾随空格。感谢大家的帮助。正是我需要的。【参考方案2】:

如果它们是标签,您应该可以使用:

foreach($array as $row) 
    $pieces = explode("\t",$row);

【讨论】:

它们不是标签。它们只是空间序列。 我一定是看错了你的问题,我以为你说你添加了标签。 这不是我的问题。我认为他说他在问题中添加了标签以提高可读性,它们在原始数据中并不真正存在。【参考方案3】:

将它们分类是问题所在。下面给了我这个。我不确定我现在是否需要在其中使用另一个 foreach 某种组合。我一直在查看示例,但没有找到任何包含这么多字段的字符串。

foreach($disks as $row)
                $arraynew = explode("\t", $row);
                print_r($arraynew);

          
Array ( [0] => vg00 LVM 136G /dev/cciss/c0d0p2 N/A N/A LOCAL N/A N/A NO )     
Array ( [0] => vg01 LVM 1G /dev/mapper/mpath28p1   60060e80013 /dev/dm-33 R700 LS4P991 0013 YES )

【讨论】:

那么它们不是你说的标签【参考方案4】:

如果列仅由 1 个空格分隔是准确的,我可以建议以下内容:

$result = Array();
foreach($main_array as $string)
    $array = explode(" ", $string);
    //now here you can sort them in the new array however you wish with the appropriate index and value.

按空格展开,“”,而不是制表符,“\t”

【讨论】:

以上是关于列中分隔的字符串的PHP数组到关联数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在PHP中按字符将数组拆分为关联数组[重复]

当字符串包含 PHP 中的重复键时,如何将字符串转换为关联数组? [复制]

PHP - 作为对象的关联数组[重复]

PHP关联数组重复键

MySQL/PHP:如何获取列和关联数据

php 关联数组过滤器重复