2016-08-26 2 views
2

Я пытаюсь создать массив в PHP, который имеет структуру, определенную строкой. Он будет проходить через и использовать первое значение как значение, а второе значение - как количество. Например, 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 Defintion. Второй - просто объединяет результаты с первого, пока вы не достигнете количества, а затем остановится и вернет правильное количество предметов назад.

Приведенные выше результаты:

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.

Для создания строк вы можете использовать сериализацию и 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

Это либо не отвечает на вопрос, либо я действительно неправильно понял, что спрашивает ОП. – 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))); 

Меньше массивов и потенциально быстрее.

Однако я бы предложил пересмотреть начальное строковое представление и искать лучший подход. Почему этот формат нужен, если его нужно преобразовать?