4 回答
TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
同樣的想法是將輸入分成 1 和 0,然后只要還有一些東西要輸出,就輸出 0 和 1。每次輸出一個(gè)值時(shí),數(shù)組都會(huì)減少,這會(huì)一直持續(xù)到兩個(gè)列表都是空的,所以應(yīng)該處理不平衡的列表......
$temp = [ 0 => [], 1 => []];
foreach($args as $key=>$value){
$temp[$value['zebra']][] = $key;
}
$output = [];
while ( !empty($temp[0]) || !empty($temp[1]) ) {
if ( !empty($temp[0]) ) {
$next = array_shift($temp[0]);
$output [$next] = $args[$next];
}
if ( !empty($temp[1]) ) {
$next = array_shift($temp[1]);
$output [$next] = $args[$next];
}
}
TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊
這是array_map在單獨(dú)的數(shù)組中抓取 1 和 0 后使用的解決方案:
$args0 = array_filter($args, function ($arg) {
return $arg['zebra'] === 0;
});
$args1 = array_filter($args, function ($arg) {
return $arg['zebra'] === 1;
});
$result = array_merge(...array_map(static function ($arg0Key, $arg1Key) use ($args0, $args1) {
if ($arg0Key !== null) {
$result[$arg0Key] = $args0[$arg0Key];
}
if ($arg1Key !== null) {
$result[$arg1Key] = $args1[$arg1Key];
}
return $result;
}, array_keys($args0), array_keys($args1)));
print_r($result);
演示:https ://3v4l.org/sfqeq
注意:使用兩個(gè)array_filter分隔值看起來(lái)不錯(cuò),但循環(huán)$args兩次;如果初始數(shù)組可能有點(diǎn)大,則更喜歡簡(jiǎn)單的循環(huán)。不過(guò),這不是答案的相關(guān)部分。
TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個(gè)贊
我可以建議您使用帶有比較計(jì)數(shù)的解構(gòu)。
第一步,您可以使用zebra = 1和 with收集所有索引zebra = 0:
$zeros = [];
$ones = [];
foreach($args as $let=>$arg){
if ($arg['zebra'] === 1) {
$ones[] = $let;
} else if ($arg['zebra'] === 0) {
$zeros[] = $let;
}
}
現(xiàn)在您可以構(gòu)造結(jié)果數(shù)組,例如:
if(abs(count($zeros) - count($ones)) === 1) { // if their difference equal to 1
if (count($ones) > count($zeros)){ // if $ones is bigger
foreach($zeros as $ind=>$let){
$res[$ones[$ind]] = ['zebra' => 1];
$res[$let] = ['zebra' => 0];
$tmp = $ind;
}
$res[$ones[$tmp+1]] = ['zebra' => 1];
} else if (count($ones) < count($zeros)){ // if $zeros is bigger
foreach($ones as $ind=>$let){
$res[$zeros[$ind]] = ['zebra' => 0];
$res[$let] = ['zebra' => 1];
$tmp = $ind;
}
$res[$zeros[$tmp+1]] = ['zebra' => 0];
}
}
輸出:
Array
(
[b] => Array
(
[zebra] => 0
)
[a] => Array
(
[zebra] => 1
)
[c] => Array
(
[zebra] => 0
)
[e] => Array
(
[zebra] => 1
)
[d] => Array
(
[zebra] => 0
)
)
演示
如果在 (1,0,1,0,0) 的情況下需要結(jié)果,請(qǐng)使用下一個(gè)構(gòu)造函數(shù):
if (count($ones) > count($zeros)){
foreach($ones as $ind=>$let){
if (isset($zeros[$ind])) $res[$zeros[$ind]] = ['zebra' => 0];
$res[$let] = ['zebra' => 1];
}
} else if (count($zeros) > count($ones)){
foreach($zeros as $ind=>$let){
$res[$let] = ['zebra' => 0];
if (isset($ones[$ind])) $res[$ones[$ind]] = ['zebra' => 1];
}
}
輸出:
Array
(
[b] => Array
(
[zebra] => 0
)
[a] => Array
(
[zebra] => 1
)
[d] => Array
(
[zebra] => 0
)
[c] => Array
(
[zebra] => 1
)
[e] => Array
(
[zebra] => 0
)
)
TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
好吧,您可以收集0一個(gè)數(shù)組中的所有1s' 和另一個(gè)數(shù)組中的所有 s',然后只需將它們交替添加到新數(shù)組中并進(jìn)行布爾flag檢查。
偽代碼:
ones = []
zeroes = []
for($args as key => value)
value['key'] = key // to preserve the key as well for later restoration
if(value['zebra'] == 1)
ones.push(value)
else
zeroes.push(value)
result = []
flag = true // to decide to pop from ones or zeroes
while(sizeof(ones) > 0 || sizeof(zeroes) > 0){
if(sizeof(ones) == 0 || flag === false){
element = zeroes.pop()
result[element['key']] = ['zebra' => element['zebra']]
}else if(sizeof(zeroes) == 0 || flag){
element = ones.pop()
result[element['key']] = ['zebra' => element['zebra']]
}
flag = !flag // to alternately add from either arrays
}
- 4 回答
- 0 關(guān)注
- 130 瀏覽
添加回答
舉報(bào)
