亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何訂購“斑馬”數組,以便每個鍵都有一個備用值(1、0)

如何訂購“斑馬”數組,以便每個鍵都有一個備用值(1、0)

PHP
森欄 2022-07-29 10:16:03
如果你有這個 PHP 數組:$args = array(    'a' => array(        'zebra' => 1,    ),    'b' => array(        'zebra' => 0,    ),    'c' => array(        'zebra' => 0,    ),    'd' => array(        'zebra' => 0,    ),    'e' => array(        'zebra' => 1,    ),);有沒有辦法通過“斑馬”鍵值在算法上改變這個數組的順序,但不是“增量”(0,0,0,1,1),它們會交替(0,1,0,1 ,0)。因此,使用上面的示例,所需的完成數組將如下所示:$ordered_args = array(    'b' => array(        'zebra' => 0,    ),    'a' => array(        'zebra' => 1,    ),    'c' => array(        'zebra' => 0,    ),    'e' => array(        'zebra' => 1,    ),    'd' => array(        'zebra' => 0,    ),);任何額外的重復項都應附加到末尾,因此解決方案應允許其他數組,例如具有斑馬值的數組,例如 (1,1,1,1,0,0),這將導致 (0,1,0, 1,1,1)我根本想不通這個!編輯:我嘗試通過這個類似但不同的 question使用 usort 來做到這一點,但答案是否定的,所以我正在尋找一個編程解決方案(沒有 usort)。
查看完整描述

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];

    }

}


查看完整回答
反對 回復 2022-07-29
?
翻閱古今

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兩次;如果初始數組可能有點大,則更喜歡簡單的循環。不過,這不是答案的相關部分。


查看完整回答
反對 回復 2022-07-29
?
德瑪西亞99

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

        )


)


查看完整回答
反對 回復 2022-07-29
?
寶慕林4294392

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

}


查看完整回答
反對 回復 2022-07-29
  • 4 回答
  • 0 關注
  • 117 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號