2016-08-26 22 views
2

文字列で定義された構造体を持つPHPで配列を作成しようとしています。これはループして最初の値を値として使用し、2番目の値を数量として使用します。たとえば、1 | 3は1,3の値をとり、文字列の次のものにループします。ここでPHPで文字列から動的配列を作成するにはどうしたらいいですか?

私がこれまで持っているものである -

<?php 

$quantity = 10; 
$string = '1|3,2|3'; 
$overall_types = array(); 

$types = explode(',', $string); 

for ($i = 1; $i <= $quantity; $i++) 
{ 
    $qc = explode('|', $types[0]); 
    $overall_types[$i] = $qc[0]; 
} 

echo '<pre>'; 
print_r ($overall_types); 
echo '</pre>'; 

、それは私に

Array 
(
    [1] => 1 
    [2] => 1 
    [3] => 1 
    [4] => 1 
    [5] => 1 
    [6] => 1 
    [7] => 1 
    [8] => 1 
    [9] => 1 
    [10] => 1 
) 

を取得しますが、私は結果が

Array 
(
    [1] => 1 
    [2] => 1 
    [3] => 1 
    [4] => 2 
    [5] => 2 
    [6] => 2 
    [7] => 1 
    [8] => 1 
    [9] => 1 
    [10] => 2 
) 

になりたい私はわかりません分解された値を簡単に切り替える方法。

ありがとうございました。

答えて

1

あなたは、私が見ていることから全く繰り返し回数を使用していません。単純なアプローチを使用してこれを達成するのは難しく、これを行う簡単な方法がある場合はおそらく必要ではありません。

<?php 
function buildReps($string) { 
    $array = []; 
    $overall_types = array(); 
    $types = explode(',', $string); 
    foreach ($types as $type) { 
     $qc = explode('|', $type); 
     $array = array_merge($array, array_fill(0, $qc[1], $qc[0])); 
    } 
    return $array; 
} 

function buildAllReps($string, $quantity) { 
    $array = []; 

    while (count($array) < $quantity) { 
      $array = array_merge($array, buildReps($string)); 
    } 
    return array_slice($array, 0, $quantity); 
} 

$quantity = 10; 
$string = '1|3,2|3'; 

echo '<pre>'; 
print_r (buildAllReps($string, $quantity)); 
echo '</pre>';  

最初の関数は、$string定義に基づいて配列を1回構築します。 2番目の方法は、数量に達するまで最初の結果をマージしてから、正しい数のアイテムを戻して戻します。

上記出力:

Array 
(
    [0] => 1 
    [1] => 1 
    [2] => 1 
    [3] => 2 
    [4] => 2 
    [5] => 2 
    [6] => 1 
    [7] => 1 
    [8] => 1 
    [9] => 2 
) 

https://eval.in/629556

$stringによって供給された定義は、非空の配列を生成しない場合に発生する可能性が無限ループに注意してください。

0

PHPで配列を文字列にするより良い方法があります。

serializeとunserialize、またはjson_encodeとjson_decodeを使用して文字列を作成し、配列に変換することができます。これらのメソッドはPHPコアに含まれているため、これは実装したいものよりはるかに優れています。

http://php.net/serialize

http://php.net/manual/ro/function.json-encode.php

配列にJSON文字列から、あなたはこのような何かをする必要があります。

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; 

// extra boolean parameter set to true to return array instead of json object 
$array = json_decode($json, true); 
+2

これは質問に答えないか、私はOPが求めていることを本当に誤解しています。 – apokryfos

+0

彼は文字列をパースする方法が必要だと言ったが、あなたは正しい。彼はもっと複雑なものを望んでいた。 –

0
<?php 
$quantity = 10; 
$string = '1|3,2|3'; 
$overall_types = []; 

$types = explode(',', $string); 
for($c = 0; $c < $quantity; $c++) { 
foreach ($types as $currentType) { 
$qc = explode('|', $currentType); 
for ($i = 0; $i < $qc[1]; $i++) { 
    $overall_types[] = $qc[0]; 
} 
} 
} 

$overall_types = array_slice($overall_types,0,$quantity); 

echo '<pre>'; 
print_r ($overall_types); 
echo '</pre>'; 

これはあなたが必要出力を与える必要があります。

0

ここではマイクロベンチマークには入っていませんが、preg_replace /g\w|\d+,乗算器のフルストリング表示と、preg_splitの文字列全体をこのステップの後に配列に入れることもできます。同様に:

$string = '1|3,2|3'; 

print_r(str_split(preg_replace_callback('/(\w)\|(\d+),?/', function($a) { 
    return str_repeat($a[1], $a[2]); 
}, $string))); 

配列の処理が少なく、潜在的に高速です。

ただし、初期の文字列表現を再考し、より良いアプローチを探してみることをお勧めします。とにかくこの形式を変換する必要がある場合、なぜこの形式が必要ですか?

関連する問題