首页 > 解决方案 > 仅基于已知键创建多维数组

问题描述

我正在尝试将字符串转换为带有仅允许的键的多维数组。

给定字符串:

"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"
}

我究竟做错了什么?

标签: php

解决方案


首先使用允许的键构建关联数组。

将您的字符串分解 - 首先explode通过逗号分隔符放入一个数组以获取您的对,然后是trimexplode对。如果左侧是允许的键,则将右侧添加到关联数组元素。像往常一样,不止一种方法可以做到这一点,但这就是我目前的咖啡因水平所要求的......

<?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
        )

)

推荐阅读