【问题标题】:PHP - Multidimensional array based placeholders find and replacePHP - 基于多维数组的占位符查找和替换
【发布时间】:2017-11-17 18:22:04
【问题描述】:

我有一个多维数组,我需要能够用相关值替换 JSON 占位符。 我也需要能够级联这些值。

我可能只是错过了一件简单的事情,但它已经困扰我好几天了。 如果有人可以为我指出解决方法,我将不胜感激。


例如这是我的数据数组:

$SCREEN = array(
    'z5OrfqifU8RiA' =>
    array(
        'current_status' => 'Completed',
        'email' => 'luke@test.com',
        'Messages' =>
        array(
            array(
                array(
                    'type' => 'message',
                    'messageIndex' => 0,
                    'ReceivedAt' => '17/11/2017 17:06:23',
                    'Name' => 'Luke ',
                    'Message' => 'Hello.'
                ),
                array(
                    'type' => 'message',
                    'messageIndex' => 1,
                    'ReceivedAt' => '17/11/2017 17:06:25',
                    'Name' => 'Luke2 ',
                    'Message' => 'Hello back.'
                )
            )
        ),
        'Message Count' => 2,
    )
);

我需要将表示数组值的占位符作为点表示法,并使用通配符将它们替换为正确的字符串或子数组。

这里有一些之前和之后的例子......

来自:

{ "Messages": "{{SCREEN.Messages}}"}

收件人:

{
    "Messages": [
        {
          "type": "message",
          "messageIndex": 0,
          "ReceivedAt": "17/11/2017 17:06:23",
          "Name": "Luke",
          "Message": "Hello."
        },{
          "type": "message",
          "messageIndex": 1,
          "ReceivedAt": "17/11/2017 17:07:06",
          "Name": "Luke2",
          "Message": "Hello back."
        }
      ]
}

来自:

{ "email": "{{SCREEN.email}}"}

收件人:

{ "email": "luke@test.com"}

来自:

{ "everything": "{{SCREEN.*}}"}

收件人:

{
  "everything": {
    "z5OrfqifU8RiA": {
      "current_status": "Completed",
      "email": "luke@test.com",
      "Messages": [
        [
          {
            "type": "message",
            "messageIndex": 0,
            "ReceivedAt": "17/11/2017 17:06:23",
            "Name": "Luke",
            "Message": "Hello."
          },
          {
            "type": "message",
            "messageIndex": 1,
            "ReceivedAt": "17/11/2017 17:07:06",
            "Name": "Luke2",
            "Message": "Hello back."
          }
        ]
      ],
      "Message Count": 2
    }
  }
}

如果您明确地针对一个值而不是针对使用通配符的数组来获取该键的任何子项,则这是当前的代码。

$SCREEN = array(
    'z5OrfqifU8RiA' =>
    array(
        'current_status' => 'Completed',
        'email' => 'luke@test.com',
        'Messages' =>
        array(
            array(
                array(
                    'type' => 'message',
                    'messageIndex' => 0,
                    'ReceivedAt' => '17/11/2017 17:06:23',
                    'Name' => 'Luke ',
                    'Message' => 'Hello.'
                ),
                array(
                    'type' => 'message',
                    'messageIndex' => 1,
                    'ReceivedAt' => '17/11/2017 17:06:25',
                    'Name' => 'Luke2 ',
                    'Message' => 'Hello back.'
                )
            )
        ),
        'Message Count' => 2,
    )
);



$X = parseVariables('{ "everything": "{{SCREEN.*}}"}');


$Y = parseVariables('{ "email": "{{SCREEN.email}}"}');


function parseVariables($array) {
    GLOBAL $SCREEN;

    foreach(flatten($SCREEN) AS $K => $V)$array = MD_ArrayFandR("{{SCREEN.".$K."}}",$V,$array);

    return $array;
}



function flatten($array) {
    $result = array();
    foreach($array as $key=>$value) {
        if(is_array($value)) {
            $result = $result + flatten($value, $key . '.');
        } else {
            $result[$key] = $value;
        }
    }
    return $result;
}


function MD_ArrayFandR($Find, $Replace,$Array){
    if (is_array($Array)){
        $ex=json_encode($Array);
        return json_decode(str_replace($Find, $Replace,$ex),true);
    } else {
        return str_replace($Find, $Replace,$Array);
    }
}


print_r($X);

print_r($Y);

【问题讨论】:

  • 为什么flatten 取一个参数,但你用两个来调用它?一个简单的解决方法是使用 SCREEN 作为另一个键,即向数组添加另一个级别,并且根本不使用通配符。虽然我觉得你的代码可以更简单:-? (虽然没有真正考虑过)

标签: php arrays json multidimensional-array preg-replace


【解决方案1】:

写一个递归函数,可以下放到结构中,比如:

function recurse($foo) {
    foreach( $foo as $key => $value ) {
        if( is_array($value) ) {
            $foo[$key] = recurse($value);
        } else if( /* $value is a placeholder */ ) {
            $foo[$key] = /* replacement */;
        }
    }
    return $foo
}

【讨论】:

  • 嗨,Sammitch,你能再解释一下吗?感谢您查看我的问题。
猜你喜欢
  • 2015-01-01
  • 2012-04-23
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 2019-07-19
  • 2014-10-15
  • 1970-01-01
相关资源
最近更新 更多