只对关联数组中的奇数元素进行排序


Sorting only odd elements of an associative array

如果我有一个类似的关联数组

  • 3=>50

  • 4=>12

  • 5=>45

  • 6=>89

  • 7=>5

  • 8=>1

现在我只想按升序对奇数键的值进行排序。输出应为:

  • 7=>5

  • 4=>12

  • 5=>45

  • 6=>89

  • 3=>50

  • 8=>1

要维护原始密钥,必须首先分离偶数和奇数元素:

$odd = $even = array();
array_walk( $array, function( $val, $key ) use ( &$odd, &$even ) { ( $key % 2 ) ? $odd[$key] = $val : $even[$key] = $val; });

然后,对$odd数组进行排序:

asort( $odd );

最后,您重建阵列:

$array = array();
while( current( $odd ) || current( $even ) )
{
    if( current( $odd ) )  $array[key($odd)]  = current( $odd );
    if( current( $even ) ) $array[key($even)] = current( $even );
    next( $odd );
    next( $even );
}
print_r( $array );

eval.in演示

请注意,您的问题有点模棱两可:不完全清楚您是基于键值还是基于键值位置的奇数/偶数:此解决方案考虑键值,并通过whileif检查确保所有值都得到保留,即使您的偶数键多于奇数键(或反之亦然)。

试试这个:

<?php
$array = array(
    3 => 50,
    4 => 12,
    5 => 45,
    6 => 89,
    7 => 5,
    8 => 1
);
$oddElems = array();
$evenElems = array();
$i = 0;
foreach($array as $index => $value)
{
    if($i % 2 == 0)
        $oddElems[$index] = $value;
    else
        $evenElems[$index] = $value;
    $i++;
}
//sort odd elements
asort($oddElems);
$result = array();
while(!empty($oddElems) || !empty($evenElems))
{
    $lastEvenElemKey = array_keys($evenElems, end($evenElems))[0];
    $evenElem = array_pop($evenElems);
    if($evenElem !== null)
        $result[$lastEvenElemKey] = $evenElem;
    $lastOddElemKey = array_keys($oddElems, end($oddElems))[0];
    $oddElem = array_pop($oddElems);
    if($oddElem !== null)
        $result[$lastOddElemKey] = $oddElem;
}
echo '<pre>';
$result = array_reverse($result, true);
print_r($result);

结果是:

Array
(
    [7] => 5
    [4] => 12
    [5] => 45
    [6] => 89
    [3] => 50
    [8] => 1
)

这就是你在PHP中可以做到的,这就是你想要的吗?

$array(3 => 50, 4 => 12, 5 => 45, 6 => 89, 7 => 5, 8 => 1);
function sort_it($array) {
    $final_array[];
    $array_only_odd_keys[];
    $array_only_odd_stuff[];
    $array_only_even_keys[];
    $array_only_even_stuff[];
    foreach($array as $key => $value) {
        if($key & 1) {
            //Key is odd
            array_push($array_only_odd_stuff,  $key => $value);
            array_push($array_only_odd_keys,  $key);
        }
        else {
            // Key is even
            array_push($array_only_even_stuff,  $key => $value);
            array_push($array_only_even_keys,  $key);
        }
    }
    $array_only_odd_keys = asort($array_only_odd_keys);
    for ($x = 0; $x <= count($array)/2; $x++) {
        if ($x & 1) {
            array_push($final_array, $array_only_odd_keys[$x],     $array_only_odd_stuff[$array_only_odd_keys[$x]]);
        }
        else {
            array_push($final_array, $array_only_even_keys[$x],     $array_only_odd_stuff[$array_only_even_keys[$x]]);
        }
    } 
    return $final_array;

这就是我在PHP中的做法,但前提是您希望最终数组像您的示例中那样在偶数键和奇数键之间切换。

最简单的方法可能是将数组分为偶数和奇数数组,对奇数数组进行排序,然后将它们粘在一起:

$odd = $even = [];
foreach (array_chunk($myArray, 2, true) as $pair) {
    $odd += array_slice($pair, 0, 1, true);
    $even += array_slice($pair, 1, 1, true);
}
asort($odd);
$result = [];
for ($i = 0; $i < count($odd); $i++) {
    $result += array_slice($odd, $i, 1, true);
    $result += array_slice($even, $i, 1, true);
}

这种相当天真的实现假设奇数和偶数的数量相等,它们总是交替的,数组以奇数开始。