列中分隔的字符串的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数组到关联数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章