Как попеременно дублировать массив в php?

Например, у меня есть массив:

$x = array("a", "b", "c", "d", "e");

Есть ли какая-либо функция для перебора всех значений массива и дублирования значений в:

$x = array("a", "a", "b", "b", "c", "c", "d", "d", "e", "e");

Я не нашел никакого связанного решения после того, как какое-то время гуглил его.

Большое спасибо!

Аналогично: stackoverflow.com/q/8234899/2943403

mickmackusa 08.03.2019 09:02

Каково ваше фактическое использование этой техники? Хранение избыточных данных не пахнет передовым опытом. Что ты делаешь, фактически?

mickmackusa 08.03.2019 09:04

это не то похожее чувак! Это трудно объяснить, но мой проект требует некоторых условий, при которых я должен удвоить значения, чтобы я мог прочитать их дважды, когда я foreach. Извините, если есть другой более эффективный способ сделать это, но сейчас я просто думаю об этом.

Long Jackson 08.03.2019 09:52

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

mickmackusa 08.03.2019 09:52
так что я могу прочитать их дважды, когда я foreach. Почему бы просто не сделать одно и то же дважды в цикле? foreach($a as $b){ echo $b; echo $b;}
Andreas 08.03.2019 09:53

Нет нет. Это похоже на то, что у меня есть два поля, и я должен повторять уникальное значение для обоих полей каждый раз, когда я foreach.

Long Jackson 08.03.2019 10:05

Никогда не поздно прояснить вашу проблему с кодированием. Я проголосовал за закрытие как неясное. Из вашего опубликованного вопроса и примера данных неясно, в чем именно вам нужна помощь.

mickmackusa 08.03.2019 10:49

@mickmackusa Я думаю, ты на правильном пути. Более внимательное изучение этого вопроса сильно пахнет XY-проблема

Phil 08.03.2019 10:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
6
8
83
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Похоже на достаточно простое сокращение (с использованием array_reduce())

$x = array_reduce($x, function($arr, $val) {
    array_push($arr, $val, $val);
    return $arr;
}, []);

Демо ~ https://3v4l.org/eNH8a


Только что понял, что "снижение" звучит немного забавно, так как мы увеличиваем массив. Думайте об этом больше как о трансформация. См. https://en.wikipedia.org/wiki/Reduce_(parallel_pattern)

Я рекомендую изменить тело функции сокращения на: return array_merge($arr, array_pad([], $times, $val)); - таким образом можно легко изменить $times - добавить use ($times) в объявление функции сокращения

dWinder 08.03.2019 10:14

@dWinder Я понимаю, что ты имеешь в виду. Я чувствую, что мог бы сделать что-то более лаконичное, используя оператор PHP шлепок. я подумаю об этом

Phil 08.03.2019 10:50

Не уверен, что для этого есть библиотечная функция, но вы ищете что-то вроде этого:

function duplicate_array($array=array()) {
    $result = array();
    foreach($array as $elem) {
        $result[] = $elem;
        $result[] = $elem;
    }

    return $result;
}

Теоретически это должно делать то, что вы хотите.

$x = array("a", "b", "c", "d", "e");

var_dump($x);

$x = duplicate_array($x);

var_dump($x);

Это должно вывести:

array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
}
array(10) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "a"
  [2]=>
  string(1) "b"
  [3]=>
  string(1) "b"
  [4]=>
  string(1) "c"
  [5]=>
  string(1) "c"
  [6]=>
  string(1) "d"
  [7]=>
  string(1) "d"
  [8]=>
  string(1) "e"
  [9]=>
  string(1) "e"
}

Итерация по массиву и сохранение значений в новом массиве — простое решение.

$x =  array("a", "b", "c", "d", "e");
$result_array = [];
$repeat_x_times = 2;

foreach ($x as $element) {
    for ($i = 0; $i < $repeat_x_times ; $i++) {
        $result_array[] = $element;
    }
}

Другие вопросы по теме