【发布时间】: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