Php 仅基于已知关键帧创建多维数组

Php 仅基于已知关键帧创建多维数组,php,Php,我正在尝试将字符串转换为只允许使用键的多维数组 给定字符串: “类型:蓝色,类型:红色,班次:第二,班次:第一,类别:圆圈,系统:未知” 使用唯一可能的键: $possibleKeys = [ "category", "shift", "type" ]; 创建阵列: $searchArray = array( "type" => [ "blue", "red" ], "shift" => [ "second", "first" ],

我正在尝试将字符串转换为只允许使用键的多维数组

给定字符串:

“类型:蓝色,类型:红色,班次:第二,班次:第一,类别:圆圈,系统:未知”

使用唯一可能的键:

$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 ];
    }
}
但是当I
var_dump
时,数组是垃圾,一些键有额外的空格

array(4) {
  ["type"]=>
  string(9) "blue"
  [" type"]=>
  string(8) "red"
  [" shift"]=>
  string(5) "first"
  [" category"]=>
  string(3) "circle"
}

我做错了什么?

因为你用“,”尝试用“,”(逗号空格)来爆炸。

因为你用“,”尝试用“,”(逗号空格)来爆炸。

你可以对你的代码做一些小的调整,避免使用一些额外的方法,比如
trim()
array\u key\u exits()



演示:

您可以对代码进行一些小的调整,并避免使用一些额外的方法,如
trim()
array\u key\u exits()



演示:

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

将字符串拆分-首先用逗号分隔符将
分解成一个数组以获得对,然后对每对进行
修剪
分解。如果左侧是允许的关键点,请将右侧添加到关联数组元素。像往常一样不止一种方法,但这正是我目前咖啡因水平所要求的

Array
(
    [category] => Array
        (
            [0] => circle
        )

    [shift] => Array
        (
            [0] => second
            [1] => first
        )

    [type] => Array
        (
            [0] => blue
            [1] => red
        )

)

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

将字符串拆分-首先用逗号分隔符将
分解成一个数组以获得对,然后对每对进行
修剪
分解。如果左侧是允许的关键点,请将右侧添加到关联数组元素。像往常一样不止一种方法,但这正是我目前咖啡因水平所要求的

Array
(
    [category] => Array
        (
            [0] => circle
        )

    [shift] => Array
        (
            [0] => second
            [1] => first
        )

    [type] => Array
        (
            [0] => blue
            [1] => red
        )

)

您可以使用正则表达式查找值并仅循环可能的键。
这意味着它只需进行三次迭代即可找到所有值并将其放入数组中。
preg_匹配将在完整字符串中找到与键连接的所有单词

array(3) {
  ["category"]=>
  array(1) {
    [0]=>
    string(6) "circle"
  }
  ["shift"]=>
  array(2) {
    [0]=>
    string(6) "second"
    [1]=>
    string(5) "first"
  }
  ["type"]=>
  array(2) {
    [0]=>
    string(4) "blue"
    [1]=>
    string(3) "red"
  }
}
输出为:


您可以使用正则表达式查找值并仅循环可能的键。
这意味着它只需进行三次迭代即可找到所有值并将其放入数组中。
preg_匹配将在完整字符串中找到与键连接的所有单词

array(3) {
  ["category"]=>
  array(1) {
    [0]=>
    string(6) "circle"
  }
  ["shift"]=>
  array(2) {
    [0]=>
    string(6) "second"
    [1]=>
    string(5) "first"
  }
  ["type"]=>
  array(2) {
    [0]=>
    string(4) "blue"
    [1]=>
    string(3) "red"
  }
}
输出为:


正确。它没有添加到数组中。明白了。抱歉,没有注意到您添加了该信息。找到了解决办法。将其作为答案发布。应用
trim()
。我再花半个小时。旅行<代码>:(
我必须说这是一个非常精确的问题。+1更正。它没有添加到数组中。明白了。抱歉,没有注意到您添加了该信息。找到了解决方案。将其作为答案发布。应用
trim()
。我将再花半个小时。旅行。
:(
我必须说这是一个很好的问题。+1我喜欢这个解决方案,因为它不需要我有一个额外的忽略键数组。@user-44651公平地说,我相信Ivans的答案也不需要它。我喜欢这个解决方案,因为它不需要我有一个额外的忽略键数组。@user-44651公平地说,我喜欢它ieve Ivans answer不需要它。此答案表示如果字符串中添加了任何新的不需要的项,则必须手动将项添加到忽略数组。此答案表示如果字符串中添加了任何新的不需要的项,则必须手动将项添加到忽略数组
array(3) {
  ["category"]=>
  array(1) {
    [0]=>
    string(6) "circle"
  }
  ["shift"]=>
  array(2) {
    [0]=>
    string(6) "second"
    [1]=>
    string(5) "first"
  }
  ["type"]=>
  array(2) {
    [0]=>
    string(4) "blue"
    [1]=>
    string(3) "red"
  }
}