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

3
如果我有一个类似于关联数组的东西:
  • 3 => 50

  • 4 => 12

  • 5 => 45

  • 6 => 89

  • 7 => 5

  • 8 => 1

现在我想按升序排序奇数键的值。输出应该是:
  • 7 => 5

  • 4 => 12

  • 5 => 45

  • 6 => 89

  • 3 => 50

  • 8 => 1


7
我看不到你尝试做任何事情,给我们展示代码,我们可以尝试帮助你。 - Krac
你的问题几乎没有意义。如果我们试图获取奇数键,那么为什么期望 4 => 12、6 => 89 和 8 => 1?4、6 和 8 都是偶数。 - Object Manipulator
你说,“只对奇数键的值进行升序排序”,但你展示给我们的期望输出并不是这样的。 - rmondesilva
如果你解决了这个问题,可以回答一下,因为我很好奇你会怎么做。 - apokryfos
4个回答

2
为了保留原始键,您需要先将偶数和奇数元素分开:
$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检查确保所有值都得到保留,即使您有更多的偶数键(或反之亦然)。


1

试试这个:

<?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
)

0

这是你可以用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 中完成它。


0

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

$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);
}

这个相对幼稚的实现假设奇数和偶数的数量相等,它们总是交替出现,并且数组以奇数开头。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接