1

私が本当にPHPで立ち往生している1つの問題を解決するのを手伝ってください

私は1つの大きな配列を持っています

$a = array(
    'foo_1' => 'Dog',
    'bar_1' => 'Cat',
    'baz_1' => 'Fish',
    'foo_2' => 'Frog',
    'bar_2' => 'Bug',
    'baz_2' => 'Ddd',
    ...
);

そしてそれは複数の配列に変換される必要があります:

$a_1 = array(
    'foo' => 'Dog',
    'bar' => 'Cat',
    'baz' => 'Fish'
);  

$a_2 = array(
    'foo' => 'Frog',
    'bar' => 'Bug',
    'baz' => 'Ddd'
);

お気づきのように、小さなロジックがあります。大きな配列は、キーのセットで分割する必要があります(_1、_2、_3; _1、_2、_33)

私が十分に明確であったことを願っています!

ありがとう

4

4 に答える 4

2

キーが常に3つのアイテムごとに繰り返されそれらが注文されていると仮定すると、うまくいきますarray_chunk

$newArray = array_chunk($a, 3);
于 2012-11-12T23:52:16.137 に答える
1

この構造があると仮定$aします(OPの元の配列に重複するキーがあるため):

$a = array(
'foo_1' => 'Dog',
'bar_1' => 'Cat',
'baz_1' => 'Fish',
'foo_2' => 'Frog',
'bar_2' => 'Bug',
'baz_2' => 'Ddd'
);

このアプローチで配列を変換できます。

$temp = array();
foreach($a as $key=>$val){
    $num = substr(strrchr($key, '_'), 1);
    $nkey = basename($key, '_'.$num);
    $temp[$num][$nkey] = $val;
}
// See what happens
print_r($temp); 
于 2012-11-12T23:57:08.880 に答える
0

多次元配列の方が良いと思いますが、これはあなたが求めたものです。「_」の前に同じ文字列を持つ値は上書きされる (失われる) ため、ロジックに問題がある可能性があります。

$array1 = array();
$array2 = array();
$array3 = array();
$bigArray = array('av_1'=>'dghdfg','ab_2'=>'dgdfg');
foreach($bigArray as $key=>$value)
{
  $splitKey = explode('_',$key);
  $number = $splitKey[1];
  $newKey = $splitKey[0];
  $varName = "array".$number;
  ${$varName}[$newKey] = $value;
}

多次元:

    $newBigArray = array();
    $bigArray = array('av_1'=>'dghdfg','ab_2'=>'dgdfg');

    foreach($bigArray as $key=>$value)
    {
      $splitKey = explode('_',$key);
      $newKey = $splitKey[0];
      $number = $splitKey[1];

      if(!isset($newBigArray[$newKey])) {
        $newBigArray[$newKey] = array();
      }
      $newBigArray[$newKey][$number] = $value;
    }
    var_dump($newBigArray);
于 2012-11-12T23:46:41.987 に答える
0

すべての配列エントリのキーを取得し、それらをアンダースコア文字 (_) で分割してから、配列に入れます。

$a = array(
    'foo_1' => 'Dog',
    'bar_2' => 'Cat',
    'baz_3' => 'Fish',
    'foo_1' => 'Frog',
    'bar_2' => 'Bug',
    'baz_3' => 'Ddd',
    ...
);

$arrays = array(
    'foo' => array(),
    'bar' => array(),
    'baz' => array()
);

foreach ($a as $k => $v) {
    $s = explode("_", $k);
    if (!isset($arrays[$s[0]])) {
        $arrays[$s[0]] = array();
    }
    $arrays[$s[0]][$s[1]] = $v; // This line if you want to preserve the index (1, 2, ...)
    $arrays[$s[0]][] = $v; // Or this line if you want to reindex the arrays.
    // Comment or remove one of these two lines.
}

次に、多次元配列があります。

array(
    'foo' => array(
       "Dog",
       "Frog"
    ),
    'bar' => array(
        "Cat",
        "Bug"
    ),
    'baz' => array(
        "Fish",
        "Ddd"
    ),
    ...
)

上記の多次元配列を使用することをお勧めしますが、 「キー」 (「foo」、「bar」など)ごとに新しい変数を作成する場合は、次のスニペットを使用します。

$a = array(
    'foo_1' => 'Dog',
    'bar_2' => 'Cat',
    'baz_3' => 'Fish',
    'foo_1' => 'Frog',
    'bar_2' => 'Bug',
    'baz_3' => 'Ddd',
    ...
);

foreach ($a as $k => $v) {
    $s = explode("_", $k);
    ${$s[0]}[$s[1]] = $v; // This line if you want to preserve the index (1, 2, ...)
    ${$s[0]}[] = $v; // Or this line if you want to reindex the arrays.
    // Comment or remove one of these two lines.
}

配列$aにいくつかの重複キーがあることに注意してください。これは PHP では不可能です。
編集:あなたがそれを解決したのを見ました。

于 2012-11-13T00:00:03.730 に答える