<?php
function byName($left,$right)
{

if ($left[0] == $right[0])
{
return 0;
}
return ($left[0] < $right[0]) ? -1 : 1;
}
$employee[] = array("tom, John", "Programmer", 20);
$employee[] = array("jas, John", "Programmer", 20);
$employee[] = array("june, John", "Programmer", 20);
$employee[] = array("aili, John", "Programmer", 20);
$employee[] = array("Doe, Jane", "Programmer", 20);
$employee[] = array("Mann, Joe", "Manager", 35);
$employee[] = array("Smith, John", "CEO", 50);
$employee[] = array("Leeds, Al", "President", 100);
    
usort($employee, "byName");$name = "Smith, John";$lower_limit = 0;
$upper_limit = count($employee) - 1;
while($lower_limit < $upper_limit)
{ $index = intval(($lower_limit + $upper_limit) / 2); if (strcmp($employee['index'][0] , $name) > 0)
{
$lower_limit = $index + 1;
}
elseif (strcmp($employee['index'][0] , $name) < 0)
{                  $upper_limit = $index - 1;

}
else 
{

echo "<br>";
$lower_limit = $index;
    $upper_limit = $index;
}
}printf("该名字在数组位置"."$index<br>\n");
?>问题1
按照byName 排序后,为什么是(Doe,leed mann,smilth,alili,jas,jun,tom)不懂什么原理
问题2
就算排序后为上述内容
$name="Smith, John"; 那运行循环语句里面的选择语句应该是else(最后那个,因为相等),为什运行的是第二个谢谢

解决方案 »

  1.   

    第一,我不知道你的程序怎么跑通的,$employee['index'][0]根本跑不过去。你的表述实在是有问题,结果其实是Doe,Leed,Mann, Smith,aili,jas,june,tom,大写字母比小写字母的ASCII码要小,所以大写在前。同样的大写或者小写字母里面,就是按照字母顺序了。没明白,我改了程序以后,返回的结果是3,没有错误。
      

  2.   

    你好,谢谢恢复
    我程序运行没有错误啊
    $employee['index'][0]为什么不行?
    我echo 一下  他的值就是 "Smith, John"
    想知道你是怎么改的
    谢谢
      

  3.   

    将$employee['index']都改成$employee[$index]才能运行成功1.
    bool usort ( array &array, callback cmp_function )
    将用用户自定义的比较函数对一个数组中的值进行排序。
    比较函数必须在第一个参数被认为小于,等于或大于第二个参数时分别返回一个小于,等于或大于零的整数。对$employee排序的结果
    Array
    ( [0] => Array(
                [0] => Doe, Jane
                [1] => Programmer
                [2] => 20)
     [1] => Array(
                [0] => Leeds, Al
                [1] => President
                [2] => 100)
    [2] => Array(
                [0] => Mann, Joe
                [1] => Manager
                [2] => 35
            )
    [3] => Array
            (
                [0] => Smith, John
                [1] => CEO
                [2] => 50
            )
    [4] => Array
            (
                [0] => aili, John
                [1] => Programmer
                [2] => 20
            )
    ...
    ...
    [7] => Array
            (
                [0] => tom, John
                [1] => Programmer
                [2] => 20)
    )
    2.在排过序的$employee中查找 'Smith, John',使用的是二分查找,又叫折半查找3.找到的结果'Smith, John'$employee中的序号,也就是 3
      

  4.   

    问题1 结果是对的,因为排序,区分大小写推荐另外一种排序方式,$arrField = array_map(create_function('$n', 'return $n[0];'), $employee);
    array_multisort($arrField, SORT_DESC, $employee);
    var_dump($employee);原文