web-dev-qa-db-ja.com

多次元配列の内挿と分解

PHPで多次元配列を再帰的に展開および展開するための関数はありますか?

23
HyderA

これを行うには、再帰関数を記述します。

function multi_implode($array, $glue) {
    $ret = '';

    foreach ($array as $item) {
        if (is_array($item)) {
            $ret .= multi_implode($item, $glue) . $glue;
        } else {
            $ret .= $item . $glue;
        }
    }

    $ret = substr($ret, 0, 0-strlen($glue));

    return $ret;
}

爆発に関しては、何らかの形式的な構造を文字列に与えない限りこれは不可能です。その場合、すでに関数が存在する直列化の領域に入ります。 serializejson_encodehttp_build_query など。

47
lonesomeday

Var_dumpのように値を自動的に出力せずに、多次元配列の読み取り可能な文字列表現(分解)が必要な場合は、var_exportが適していることがわかりました。

http://www.php.net/manual/en/function.var-export.php

7
Dave

私は2つの再帰関数を作成して、爆破と爆発を行いました。結果として multi_explodeは期待どおりに機能しない可能性があります(値はすべて同じディメンションレベルで保存されます)。

function multi_implode(array $glues, array $array){
    $out = "";
    $g = array_shift($glues);
    $c = count($array);
    $i = 0;
    foreach ($array as $val){
        if (is_array($val)){
            $out .= multi_implode($glues,$val);
        } else {
            $out .= (string)$val;
        }
        $i++;
        if ($i<$c){
            $out .= $g;
        }
    }
    return $out;
}
function multi_explode(array $delimiter,$string){
    $d = array_shift($delimiter);
    if ($d!=NULL){
        $tmp = explode($d,$string);
        foreach ($tmp as $key => $o){
            $out[$key] = multi_explode($delimiter,$o);
        }
    } else {
        return $string;
    }
    return $out;
}

それらを使用するには:

echo $s = multi_implode(
    array(';',',','-'),
    array(
        'a',
        array(10),
        array(10,20),
        array(
            10,
            array('s','t'),
            array('z','g')
        )
    )
);
$a= multi_explode(array(';',',','-'),$s);
var_export($a);
2
Falk

array_walk_recursive 配列内のすべての値に対して特定の関数を再帰的に呼び出します。その関数がどのように見えるかは、実際のデータと何をしようとしているのかによって異なります。

2
Gumbo