第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

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

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

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-07-29
?
翻閱古今

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)部分。


查看完整回答
反對(duì) 回復(fù) 2022-07-29
?
德瑪西亞99

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

        )


)


查看完整回答
反對(duì) 回復(fù) 2022-07-29
?
寶慕林4294392

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

}


查看完整回答
反對(duì) 回復(fù) 2022-07-29
  • 4 回答
  • 0 關(guān)注
  • 130 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)