php - 仅基于已知键创建多维数组
问题描述
我正在尝试将字符串转换为带有仅允许的键的多维数组。
给定字符串:
"type:blue, type:red, shift:second, shift:first, category:circle, system:unknown"
使用唯一可能的键:
$possibleKeys = [ "category", "shift", "type" ];
创建数组:
$searchArray = array( "type" => [ "blue", "red" ],
"shift" => [ "second", "first" ],
"category" => [ "circle" ]
);
所以system:unknown
没有添加到,$searchArray
因为它不在$possibleKeys
数组中。
这是我的代码:
$myString = "type:blue, type:red, shift:second, shift:first, category:circle, system:unknown";
$params = explode( ",", $myString );
$possibleKeys = [ "category", "shift", "type", "chances" ];
$nodes = [];
foreach ($params as $param) {
$node = explode( ":", $param );
if (array_key_exists( $node[ 0 ], $nodes ) && in_array( $node[ 0 ], $possibleKeys )) {
array_push( $nodes[ $node[ 0 ] ], $node[ 1 ] );
} else {
$nodes[ $node[ 0 ] ] = $node[ 1 ];
}
}
但是当我var_dump
的数组是垃圾并且一些键有额外的空格时。
array(4) {
["type"]=>
string(9) "blue"
[" type"]=>
string(8) "red"
[" shift"]=>
string(5) "first"
[" category"]=>
string(3) "circle"
}
我究竟做错了什么?
解决方案
首先使用允许的键构建关联数组。
将您的字符串分解 - 首先explode
通过逗号分隔符放入一个数组以获取您的对,然后是trim
每explode
对。如果左侧是允许的键,则将右侧添加到关联数组元素。像往常一样,不止一种方法可以做到这一点,但这就是我目前的咖啡因水平所要求的......
<?php
$dataString="type:blue, type:red, shift:second, shift:first, category:circle, system:unknown";
$desiredResult=array();
foreach(array("category", "shift", "type") as $desiredKey){
$desiredResult[$desiredKey]=array();
}
$tmpArr=explode(",",$dataString);
foreach($tmpArr as $pair){
$pair=trim($pair);
$pairArr=explode(":",$pair);
if(isset($desiredResult[$pairArr[0]])){
$desiredResult[$pairArr[0]][]=$pairArr[1];
}
}
print_r($desiredResult);
?>
给
Array
(
[category] => Array
(
[0] => circle
)
[shift] => Array
(
[0] => second
[1] => first
)
[type] => Array
(
[0] => blue
[1] => red
)
)
推荐阅读
- python - Python中关于字典项添加的问题(猜词游戏)
- android - SMS Retriever API SMS Broadcaster 问题
- javascript - 使用 Array.map 并过滤对象数组,尝试删除包含 NaN 值的项目
- javascript - tmLanguage 中的注释行以 .* TextMate Grammar Syntax Highlight 开头
- javascript - Skycons 仅显示最后一个数组项
- java - 关于 while 循环的问题以及如何重新提出 ay/n 问题
- c++ - 如果错误分支的 constexpr 编译时崩溃
- java - 课堂Java编程中的代理
- java - Maven pom 具有对外部属性文件的引用。如何在您的 java 程序中读取它?
- python - 将具有非 ASCII 字节的 csv 解析为数据帧