4 回答

TA貢獻1863條經驗 獲得超2個贊
同樣的想法是將輸入分成 1 和 0,然后只要還有一些東西要輸出,就輸出 0 和 1。每次輸出一個值時,數組都會減少,這會一直持續到兩個列表都是空的,所以應該處理不平衡的列表......
$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貢獻1780條經驗 獲得超5個贊
這是array_map在單獨的數組中抓取 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
注意:使用兩個array_filter分隔值看起來不錯,但循環$args兩次;如果初始數組可能有點大,則更喜歡簡單的循環。不過,這不是答案的相關部分。

TA貢獻1770條經驗 獲得超3個贊
我可以建議您使用帶有比較計數的解構。
第一步,您可以使用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;
}
}
現在您可以構造結果數組,例如:
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) 的情況下需要結果,請使用下一個構造函數:
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貢獻2021條經驗 獲得超8個贊
好吧,您可以收集0一個數組中的所有1s' 和另一個數組中的所有 s',然后只需將它們交替添加到新數組中并進行布爾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 關注
- 117 瀏覽
添加回答
舉報