【问题标题】:How to break string by separator into multidimensional array in PHP如何在PHP中通过分隔符将字符串分解为多维数组
【发布时间】:2017-07-06 11:30:26
【问题描述】:

我有一个字符串“value1/value2”。所需的输出是 $_SESSION['value1']['value2']。我尝试使用explode,然后使用array_reduce 来处理explode 值,但没有成功。

我的代码看起来像

function set($key, $value){
/* code */
}

set('key1/key2', 'some_text');

$_SESSION['key1']['key2'] = 'some_text';这样的必需输出

key1/key2 不固定,可能是 'key1' 或 'key1/key2/key3' 等等。 任何人都可以摆弄它是非常值得赞赏的。 谢谢

【问题讨论】:

  • 你不应该完全改变问题,使原始文本的答案变得无用......在这种情况下从值访问到赋值

标签: php


【解决方案1】:

通过键路径字符串访问值,就像在您的原始问题中一样,使用您的原始想法并让 array_reduce 完成工作,如下所示:

$session = ['value1' => [ 'value2' => [ 'value3' => 'there you are!' ]]];
$path = explode('/', 'value1/value2/value3');
$val = array_reduce($path, 
                    function(&$carry, $key) { return $carry[$key];},
                    $session);
echo $val
--> "there you are!"

可以设置一个值,例如像这样,按照引用的路径,根据需要创建数组:

function set($path, $value) {
    $path = explode('/', $path); 
    $key = array_pop($path); 
    $arr = &$_SESSION; 
    foreach($path as $part) {
        // carefull, this might lose values to accommodate
        // the structure wanted with $path
        (isset($arr[$part]) && is_array($arr[$part])) || ($arr[$part] = []); 
        $arr =& $arr[$part];
    } 
    $arr[$key] = $value;
};

【讨论】:

  • 感谢汤姆的帮助。我在 if(isset($arr[$part]) && is_array($arr[$part]) || ($arr[$part] = [])) $arr =& $arr[$部分];这解决了我对两个数组元素的问题,但它对三个或更多数组元素给出了不希望的结果。我们是否可以编写类似的代码来为任意数量的元素提供所需的结果。例如 key1/key2/key3 或 key1/key2/key3/key4 等等。现在二维码没问题。
  • 这应该适用于任何大小的路径。我用长度 3 对其进行了测试。但是有一个错字,你发现了错误,但修复是错误的 - 我将它更正为预期的形式,让我们看看这是否解决了你的问题。
  • 如果没有(我添加了一个缺失的)),我很乐意再看看为什么它似乎对我有用,并且可能不会(我在 psysh 中使用@987654324 对其进行了测试@ 作为闭包)
  • 是的,我明白了。现在它完美地工作了。谢谢你的好主意。
【解决方案2】:

试试这个

<?php 
  session_start();   
  $string  = 'value1/value2';
  $array = explode("/",$string);
  $_SESSION[$array[0]][$array[1]] = "ccccccc";//$_SESSION['value1']['value2']

【讨论】:

  • 兄弟,我们不能像这样静态添加代码 $_SESSION[$array[0]][$array[1]] 因为'value1/value2'不是固定的。字符串中可能有一个或多个 /。感谢您的帮助。
【解决方案3】:

对于一般情况(即超过两个部分),您需要遍历段,并逐步索引到目标数组:

<?php
$string = 'value1/value2/value3';

$_SESSION = ['value1' => ['value2' => ['value3' => 'My String']]];

$target = $_SESSION;

foreach (explode('/', $string) as $piece) {
    $target =& $target[$piece];
}

echo $target; // My String

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2010-11-29
    • 2018-07-10
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多