Php перемешать часть ассоциативного массива - PullRequest
0 голосов
/ 25 марта 2020

Мне нужно перетасовать часть ассоциативного массива. Пример массива приведен ниже. Правила: случайное перемешивание должно происходить на одних и тех же клавишах (ad-pre, ad-mid, ad-end). Порядок ключей всегда такой (ad-pre, ad-mid, ad-end), однако массив может не всегда содержать все ключи (например, может не быть ключей ad-pre). Так, например, возьмите все элементы массива с ключами 'ad-pre', перемешайте их и верните в тот же начальный, конечный индекс.

Я закончил с этим кодом, но он грязный, и я ищу более чистый путь. Кроме того, next_key может не существовать!

<code>$data = array(
  array(
    "ad_type"=> "ad-pre",
    "type"=> "a1"
  ),
  array(
    "ad_type"=> "ad-pre",
    "type"=> "a2"
  ),
  array(
    "ad_type"=> "ad-mid",
    "type"=> "b1"
  ),
  array(
    "ad_type"=> "ad-mid",
    "type"=> "b2"
  ),
  array(
    "ad_type"=> "ad-mid",
    "type"=> "b3"
  ),
  array(
    "ad_type"=> "ad-end",
    "type"=> "c1"
    )
);
echo '<pre>';
var_dump($data);
echo '
'; $ sub = array (); $ index = 0; $ len = 0; $ Старт; $ key = 'ad-mid'; $ next_key = 'ad-end'; foreach ($ data as $ row) {if ($ row ['ad_type'] == $ key) {if (! isset ($ start)) $ start = $ index; $ Len ++; } else if ($ row ['ad_type'] == $ next_key) {// Я хочу разбить следующий ключ (поэтому он не l oop весь массив), но это не хорошо, потому что этот ключ может не существовать! перемена; } $ index ++; } var_dump ($ start, $ len); $ sub = array_splice ($ data, $ start, $ len); перетасовать ($ суб); array_splice ($ data, $ start, 0, $ sub); echo '
';
var_dump($data);
echo '
';

1 Ответ

0 голосов
/ 25 марта 2020

Я предполагаю, что ваш входной массив only содержит эти три типа ad_ty, соответственно. что вы хотите перемешать в всех из них, если их больше трех, а во входном массиве больше ничего не нужно сохранять как есть.

// group items in a helper array, under the ad_type
$helper = [];
foreach($data as $item) {
  $helper[$item['ad_type']][] = $item;
}
// loop over the grouped ad_type arrays, shuffle their items,
// add shuffled items to result array
$result = [];
foreach($helper as $items) {
  shuffle($items);
  $result = array_merge($result, $items);
}

var_dump($result);
...