【问题标题】:Php shuffle part of associative arrayphp shuffle 关联数组的一部分
【发布时间】:2020-03-24 22:19:55
【问题描述】:

我需要洗牌关联数组的一部分。数组示例如下。规则:随机播放需要在相同的键(ad-pre、ad-mid、ad-end)上发生。键的顺序总是这样(ad-pre,ad-mid,ad-end),但是数组可能并不总是包含所有键(例如,可能没有 ad-pre 键)。因此,例如,获取所有带有键“ad-pre”的数组项并将它们打乱并放回相同的开始、结束索引。

我最终得到了这段代码,但它很乱,我正在寻找一种更简洁的方法。另外,next_key 可能不存在!

$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 '</pre>';

$sub = array();
$index = 0;
$len = 0;
$start;
$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){//I want to break by next key (so it doesnt loop all array), but this is not good because this key may not exist!
        break;
    }
    $index++;
}

var_dump($start,$len);

$sub = array_splice($data, $start, $len);
shuffle($sub);
array_splice($data, $start,0, $sub);

echo '<pre>';
var_dump($data);
echo '</pre>';

【问题讨论】:

  • 旁注:这些是您正在谈论的值,而不是键。
  • “我希望它变得更好”并不是一个好问题。您的解决方案有什么问题?您期望什么样的(更好的)解决方案?详细说明!
  • 如果我理解正确,您的所有数据都已经按ad_type 键排序。如果是这种情况,else if($row['ad_type'] == $next_key) 可以简单地为else,而您根本不需要$next_key。除此之外,我认为您的解决方案没有任何问题。对于任何未来的参考,您想要改进的工作解决方案更适合codereview.stackexchange.com
  • 如果我删除 next_key,这不起作用,因为数组以 ap-pre 值开头,我要求 ad-mid,所以它立即中断。

标签: php associative-array shuffle


【解决方案1】:

我在这里假设您的输入数组包含这三个 ad_types,分别。如果超过这三个,并且输入数组中没有其他内容需要按原样保留,那么您想在 all 中随机播放。

// 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2011-05-23
    • 2012-12-19
    • 2015-01-23
    • 2021-02-16
    相关资源
    最近更新 更多