用递归比较两个php数组的大小

好几天前,我在鹏寰大厦百度钱包进行了一次面试,

然后最后一道面试题就是版本号排序。

有个产品,有很多版本,版本号是用逗号隔开的数字,如233.211.1.0.1,首先比较第一位,如果相等,则比较第二位...以此类推。如何对他们进行排序?

我拿到这个题目估计出难点应该是大小比较了,我首先想起了php处理ip的函数的思路,但是立马考虑到溢出,所以又问了一下每个数字的范围,果不其然,被告知是整形。这条路就堵死了。

然后我想到了二叉树,但是想了下过程,感觉一时很难实现,这条路也死了。

最后才想到了递归比较。 但是由于是在纸上写的,所以代码凌乱。 现在整理一下 当时想的代码如下,采用的是类似链表的结构:

$a = array(
     'value' => 19211111,
     'next'  => array(
            'value' => 168222222,
            'next'  =>  array(
                    'value' => 1,
                    'next'  =>  array(
                            'value' => 1,
                            'next'  => array()
                    )

                )

        )

    );
   $b = array(
     'value' => 19211111,
     'next'  => array(
            'value' => 168222222,
            'next'  =>  array(
                    'value' => 1,
                    'next'  =>  array(
                            'value' => 0,
                            'next'  => array()
                    )

                )

        )

    );

function compare($f,$s) {

    if(!isset($f['value']) && isset($s['value'])) {

        return 'small';
    }
    if(isset($f['value']) && !isset($s['value'])) {

        return 'big';
    }
    if(!isset($f['value']) && !isset($s['value'])) {

        return 'equal';
    }
    if($f['value'] > $s['value'] ){

        return 'big';
    }
    if($f['value'] < $s['value'] ){
        return 'small';
    }

    return compare($f['next'],$s['next']);


}
echo  compare($a,$b);

在面试完后,坐在外面的麦当劳里吃饭,想了一下,其实可以简化一下的,代码如下:


$a = '123333333.16811111.1.1';
$b = '123333333.16911111.1.0';
$arra = explode('.',$a);
$arrb = explode('.',$b);

function compare($a,$b) {
  $f = array_shift($a);
  $s = array_shift($b);
  if(!isset($f) && isset($s)) {

        return 'small';
    }
    if(isset($f) && !isset($s)) {

        return 'big';
    }
    if(!isset($f) && !isset($s)) {

        return 'equal';
    }
    if($f > $s ){
        return 'big';
    }
    if($f < $s ){

        return 'small';
    }
   return  compare($a,$b);
}
echo compare($arra,$arrb);

当然,后续还要进行冒泡比较,或者快排,或者二叉树排序,这里就不详写了。

php有个函数,可以进行比较,但是没有试过version_compare()

$arr = array('12','1.2.4.3','2.1.3.4','2.1.4.3.3','3.4.1.2','3.4.2.1','4.3.1.2','4.3.2.1','4.4.2.1.4','4.4.1.2');
usort($arr,'version_compare');
$res = array_reverse($arr);
print_r($res);