26

配列関数を使用して、パイプで区切られた文字列を連想配列に変換しています。

$piper = "|k=f|p=t|e=r|t=m|";

$piper = explode("|",$piper);

$piper = array_filter($piper);

function splitter(&$value,$key) {

    $splitted = explode("=",$value);
    $key = $splitted[0];
    $value = $splitted[1];

}

array_walk($piper, 'splitter');

var_dump($piper);

これは私に与えます

array (size=4)
  1 => string 'f' (length=1)
  2 => string 't' (length=1)
  3 => string 'r' (length=1)
  4 => string 'm' (length=1)

私が欲しいところ:

array (size=4)
  "k" => string 'f' (length=1)
  "p" => string 't' (length=1)
  "e" => string 'r' (length=1)
  "t" => string 'm' (length=1)

しかし、キーは変更されていません。配列をループしてキーと値を変更できる配列関数はありますか?

4

5 に答える 5

63

array_walkのドキュメント(コールバック関数の説明)で次のように述べられています。

配列の値のみが変更される可能性があります。その構造を変更することはできません。つまり、プログラマは要素を追加、設定解除、または並べ替えることはできません。コールバックがこの要件を尊重しない場合、この関数の動作は未定義であり、予測できません。

つまりarray_walk、反復配列のキーを変更するために使用することはできません。ただし、それを使用して新しい配列を作成できます。

$result = array();
array_walk($piper, function (&$value,$key) use (&$result) {
    $splitted = explode("=",$value);
    $result[ $splitted[0] ] = $splitted[1];
});
var_dump($result);

それでも、それが私だったら、ここで正規表現を使用すると思います(「爆発したものを爆発させる」のではなく):

$piper = "|k=f|p=t|e=r|t=m|";
preg_match_all('#([^=|]*)=([^|]*)#', $piper, $matches, PREG_PATTERN_ORDER);
$piper = array_combine($matches[1], $matches[2]);
var_dump($piper);
于 2012-11-07T13:45:57.887 に答える
2

あなたはそれをよりよく使うことができますforeach。次の例は、エントリの処理、正しいキーでの追加、および元のエントリの削除を示しています。

$piper = "|k=f|p=t|e=r|t=m|";
$piper = array_filter(explode("|", $piper));

foreach ($piper as $index => $value) {
    list($key, $value) = explode("=", $value);
    $piper[$key] = $value;
    unset($piper[$index]);
}

インデックスのようなキーを持たないように注意してください。

もう 1 つの方法は、参照を介して値を処理し、後でキーを設定することです。

foreach ($piper as &$value) {
    list($keys[], $value) = explode("=", $value);
}
unset($value);

$piper = array_combine($keys, $piper);

これにより問題が発生することはありませんが、キーが重複するだけです。ただしforeach、データが失われることはありません。

foreachおそらく結果配列にストローすることによって最も単純化されている次のものでは保証できないもの:

$result = array();
foreach ($piper as $value) {
    list($key, $value) = explode("=", $value);
    $result[$key] = $value;
}
于 2012-11-07T13:51:19.327 に答える
2

$piper から必要なキーと値を持つ新しい配列を作成してみませんか?

$piper2 = array();
foreach ($piper as $k => $val)
{
  $splitted = explode("=", $val);
  $key = $splitted[0];
  $value = $splitted[1];

  $piper2[$key] = $value;
}

$piper = $piper2; // if needed
于 2012-11-07T13:51:36.690 に答える
1

array_reduce を使用するとうまくいきます

$piper = "|k=f|p=t|e=r|t=m|";

$piper = explode("|",$piper);

$piper = array_filter($piper);

function splitter($result, $item) {
    $splitted = explode("=",$item);
    $key = $splitted[0];
    $value = $splitted[1];

    $result[$key] = $value;

    return $result;
}

$piper = array_reduce($piper, 'splitter', array());

var_dump($piper);

これに基づいて: http://www.danielauener.com/howto-use-array_map-on-associative-arrays-to-change-values-and-keys/

于 2016-09-19T12:20:08.850 に答える