Как взорвать многомерный массив? - PullRequest
1 голос
/ 10 апреля 2019

У меня есть массив массивов, таких как:

$array = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]]

Теперь я хочу сжать этот массив так, чтобы он возвращал что-то вроде этого:

  1. COTV_LITE (1800)
  2. COTV_PREMIUM (2200)

Как мне этого добиться? Вызов только функции implode() не сработал:

implode ('<br>', $array);

Ответы [ 3 ]

5 голосов
/ 10 апреля 2019

Вы можете вызвать array_map(), чтобы сжать вложенные массивы:

echo implode('<br>', array_map(function($a) { return implode(' ', $a); }, $array));

DEMO

выход:

1. COTV_LITE(1800)<br>2. COTV_PREMIUM(2200)
2 голосов
/ 10 апреля 2019

Вы можете использовать аргументы переменной длины variadic в PHP> = 5.6

Option1

$items = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]];
echo implode(' ',array_merge(...$items));

Вывод

1. COTV_LITE(1800) 2. COTV_PREMIUM(2200)

Этоэто больше precursor для следующей опции.

Option2

Если вы хотите немного более креативно, вы также можете использовать preg_replace:

$items = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]];
$replace = [
    '/^(\d+\.)$/' => '<li>\1 ',
    '/^(\w+\(\d+\))$/' => '\1</li>'
];

echo '<ul>'.implode(preg_replace(array_keys($replace),$replace,array_merge(...$items))).'</ul>';

Выход

<ul><li>1. COTV_LITE(1800)</li><li>2. COTV_PREMIUM(2200)</li></ul>

Option3

И, наконец, использование упорядоченного списка ol, который делает цифры за вас.В этом случае нам нужен только второй элемент из массива (индекс 1):

$items = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]];

echo '<ol><li>'.implode('</li><li>',array_column($items,1)).'</li></ol>';

Вывод

<ol><li>COTV_LITE(1800)</li><li>COTV_PREMIUM(2200)</li></ol>

Лично я бы поставил его в ol таким образом, чтобы выне нужно беспокоиться о порядке чисел, вы можете позволить HTML + CSS обрабатывать их.Кроме того, это, вероятно, самый простой и наиболее семантически правильный способ, но я не знаю, имеет ли нумерация в массиве какое-либо особое значение.

В любом случае я бы определенно поместил это в список для рендеринга.это в HTML.Это даст вам гораздо больше возможностей для его стилизации, позже.

Обновление

хочу использовать вариант 1. Но как мне поставить каждый параметр надругая строка с использованием <br>

Эта строка будет помещать <br> между каждым элементом массива:

   echo implode('<br>',array_merge(...$items));

Выход

  1.<br>COTV_LITE(1800)<br>2.<br>COTV_PREMIUM(2200)

Единственныйспособ легко исправить это (сохраняя array_merge ) с помощью preg_replace , который является вторым.Поэтому я назову это:

Опция 1.2

$items = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]];

echo implode(preg_replace('/^(\w+\(\d+\))$/',' \1<br>',array_merge(...$items)));

Выход

1. COTV_LITE(1800)<br>2. COTV_PREMIUM(2200)<br>

Песочница

По сути, нет способа определить, где находится конечный элемент после их объединения.Эта операция эффективно выравнивает массив и дает нам что-то вроде этого:

 ["1.","COTV_LITE(1800)","2.","COTV_PREMIUM(2200)"]

Так что Regex делает это 'COTV_PREMIUM(2200)' становится ' COTV_PREMIUM(2200)<br>'.Это просто способ изменить это без необходимости погружаться в массив с некоторой логикой или чем-то еще.Мы получаем следующую модификацию массива:

["1."," COTV_LITE(1800)<br>","2."," COTV_PREMIUM(2200)<br>"]

Затем, с помощью implode , мы просто сплющиваем его снова в строку:

 "1. COTV_LITE(1800)<br>2. COTV_PREMIUM(2200)<br>"

Regex ^(\w+\(\d+\))$

  • ^ - соответствие начала строки
  • (...) - группа захвата 1
    • \w+ - соответствие любому рабочему символу a-zA-Z0-9_ один илибольше, напримерCOTV_PREMIUM
    • \( - соответствует буквально (
    • \d+ - соответствует цифрам 0-9 одна или несколько, например 2200
    • \) - соответствует ) буквально
  • $ - соответствует концу строки

Таким образом, это соответствует шаблону вторых (или даже) элементовв массиве мы заменим это следующим:

Замена ' \1<br>'

  • {space} - добавляет начальный пробел
  • \1 -значение группы захвата 1 (сверху)
  • <br> - добавить разрыв строки

Надеюсь, что имеет смысл.Это должно работать до тех пор, пока они соответствуют этому шаблону.Очевидно, что мы можем настроить шаблон, но при таком небольшом размере выборки мне трудно знать, какие будут изменения.

Например, будет работать что-то простое, например (.+\))$ TestIt ,Этот просто ищет окончание ).Нам просто нужно что-то, чтобы захватить все четные, не совпадая с нечетными.Регулярные выражения могут очень запутать первые несколько раз, когда вы их видите, но они очень мощные.

PS - я добавил несколько ссылок на имена функций, они идут в документации PHPстраница для них.

Ура!

0 голосов
/ 10 апреля 2019

Попробуйте это

$items = [["1.","COTV_LITE(1800)"],["2.","COTV_PREMIUM(2200)"]];
$imploded = [];
foreach($items as $item) {
    $item_entry = implode(' ', $item);
    echo $item_entry . '<br/>'; // display items
    $imploded[] = $item_entry;
}
// your desired result is in $imploded variable for further use
...