2016-08-26 6 views
2

문자열로 정의 된 구조를 가진 PHP를 사용하여 배열을 만들려고합니다. 루프를 통해 첫 번째 값을 값으로 사용하고 두 번째 값을 수량으로 사용합니다. 예를 들어, 1 | 3은 1, 3 번 값을 가지며 문자열의 다음에 반복합니다. 나는 결과가PHP에서 문자열로 동적 배열을 만들려면 어떻게해야합니까?

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

잘 모르겠어요되고 싶어,

<?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 
) 

를 얻을 수 있지만 - 여기

는 내가 지금까지 무엇을 가지고 분해 된 값 사이를 쉽게 전환하는 방법.

감사합니다.

답변

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 (고화질)에 기초한 배열을 구축한다. 두 번째 것은 수량에 도달 할 때까지 첫 번째 결과를 병합 한 다음 중지하고 올바른 수량의 항목을 반환합니다.

상기 출력 :

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 코어에 있기 때문에 구현하고자하는 것보다 훨씬 낫습니다. 즉, 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))); 

적은 처리와 잠재적으로 더 빠릅니다.

그러나 나는 초기 문자열 표현을 재검토하고 더 나은 접근법을 찾도록 제안합니다. 이 형식을 변환해야하는 경우 왜이 형식이 필요합니까?