【问题标题】:Sort function not working properly排序功能无法正常工作
【发布时间】:2016-01-29 12:51:32
【问题描述】:

我正在从事旅游网站项目,我想比较两个阵列,但是当我尝试在阵列中添加新东西时,过滤停止。我想过滤,如果两个房间相等,然后检查它的计划并展示有最低利率和其他剩余结果。我为它写了下面的代码

     $arr1  =   array(
    array (
                  'ratePlanCode'  => '1',
                'roomId'  => '10',
                'whotel' =>'0',
                'roomName' => 'Standard',
                'ratePlan' => 'CPAI',
                'roomRate' => 11000
            ),
      array
            (
                'ratePlanCode'  => '2',
                'roomId'  => '10',
                'whotel' =>'0',
                'roomName' => 'test',
                'ratePlan' => 'MAP',
                'roomRate' => 10000
            ),
    array
            (
                'ratePlanCode'  => '3',
                'roomId'  => '10',
                'whotel' =>'0',
                'roomName' => 'test123',
                'ratePlan' => 'CP',
                'roomRate' => 10000
            ),
    array
            (
                'ratePlanCode'  => '4',
                'roomId'  => '10',
                'whotel' =>'0',
                'roomName' => 'test',
                'ratePlan' => 'MAP',
                'roomRate' => 10000
            )        

        );


$arr2  =   array(
    array (
                'ratePlanCode'  => '10',
                'roomId'  => '10',
                'whotel' =>'1',
                'roomName' => 'Standard',
                'ratePlan' => 'CPAI',
                'roomRate' => 12000
            ),
      array
            (
                'ratePlanCode'  => '100',
                'roomId'  => '10',
                'whotel' =>'1',
                'roomName' => 'Honeymoon',
                'ratePlan' => 'MAP',
                'roomRate' => 10800
            ),

            array
            (
                'ratePlanCode'  => '102',
                'roomId'  => '10',
                'whotel' =>'1',
                'roomName' => 'test123',
                'ratePlan' => 'CP',
                'roomRate' => 9000
            ),
            array
            (
                'ratePlanCode'  => '101',
                'roomId'  => '10',
                'whotel' =>'1',
                'roomName' => 'waff',
                'ratePlan' => 'MAP',
                'roomRate' => 10800
            ));



//print_r($hotelArray);
$data123 = array_merge($arr1,$arr2);
//print_r($data);
$output = array();
foreach($data123 as $arr){
$output [$arr['roomName']][$arr['ratePlan']][$arr['ratePlanCode']][$arr['roomId']][] =$arr['roomRate'] ;
sort($output[$arr['roomName']][$arr['ratePlan']][$arr['ratePlanCode']][$arr['roomId']]);
}
print_R($output);
//deassemble
$data = array();

foreach($output as $roomName=>$arr1)
{
    foreach($arr1 as $ratePlan=>$arr2)
    {
            foreach($arr2 as $hotelId=>$arr3)
            {
                foreach($arr3 as $roomId=>$arr4)
                {
                    foreach($arr3 as $roomId=>$arr4)
                    {

                        $data[] = array(    
                        'ratePlanCode' => $hotelId,  
                        'roomId' => $roomId, 
                        'roomName' => $roomName,
                        'ratePlan' => $ratePlan,
                        'roomRate' => $arr4[0]);
                    }
                }
            }
    }
}
echo "Final Output";
print_R($data);

我得到这样的输出

[0] => Array
        (
            [ratePlanCode] => 1
            [roomId] => 10
            [roomName] => Standard
            [ratePlan] => CPAI
            [roomRate] => 11000
        )

    [1] => Array
        (
            [ratePlanCode] => 10
            [roomId] => 10
            [roomName] => Standard
            [ratePlan] => CPAI
            [roomRate] => 12000
        )

    [2] => Array
        (
            [ratePlanCode] => 2
            [roomId] => 10
            [roomName] => test
            [ratePlan] => MAP
            [roomRate] => 10000
        )

    [3] => Array
        (
            [ratePlanCode] => 4
            [roomId] => 10
            [roomName] => test
            [ratePlan] => MAP
            [roomRate] => 10000
        )

    [4] => Array
        (
            [ratePlanCode] => 3
            [roomId] => 10
            [roomName] => test123
            [ratePlan] => CP
            [roomRate] => 10000
        )

    [5] => Array
        (
            [ratePlanCode] => 102
            [roomId] => 10
            [roomName] => test123
            [ratePlan] => CP
            [roomRate] => 9000
        )

    [6] => Array
        (
            [ratePlanCode] => 100
            [roomId] => 10
            [roomName] => Honeymoon
            [ratePlan] => MAP
            [roomRate] => 10800
        )

    [7] => Array
        (
            [ratePlanCode] => 101
            [roomId] => 10
            [roomName] => waff
            [ratePlan] => MAP
            [roomRate] => 10800
        )

但我想得到如下输出,你能帮我解决这个问题吗

[0] => Array
        (
            [hotelId] => 10
            [roomId] => 10
            [roomName] => Standard
            [ratePlan] => CPAI
            [roomRate] => 11000
        )

    [1] => Array
        (
            [hotelId] => 10
            [roomId] => 10
            [roomName] => test
            [ratePlan] => MAP
            [roomRate] => 10000
        )

    [2] => Array
        (
            [hotelId] => 10
            [roomId] => 10
            [roomName] => test123
            [ratePlan] => CP
            [roomRate] => 9000
        )

    [3] => Array
        (
            [hotelId] => 10
            [roomId] => 10
            [roomName] => Honeymoon
            [ratePlan] => MAP
            [roomRate] => 10800
        )

我已经搜索过了,但它没有工作

【问题讨论】:

    标签: php multidimensional-array


    【解决方案1】:

    函数array_multisort()很有用,

       <?php
        $array = array('Alpha', 'atomic', 'Beta', 'bank');
        $array_lowercase = array_map('strtolower', $array);
    
        array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array);
    
        print_r($array);
        ?>
    

    【讨论】:

    • 不,我必须按计划比较房间名称,然后显示最低房价和其他独特房间的房间,这是上面的逻辑,我在数组中添加了一个新字段,但它不起作用跨度>
    • $data123 是您拥有的所有数据,我是对的。如果我们对其进行排序,您就可以得到您想要的。
    • 不,亲爱的,您复制我的代码并将您的函数应用于其中,您将得到结果检查输出它不匹配
    • 让我试一试,我会给出答案。
    • 试试这个,请给我答案
    【解决方案2】:

    这是你的答案:)

    $mergedArr = array_merge($arr1,$arr2);
    $res = [];
    foreach($mergedArr as $key=>$val){      
            $res[$val['roomRate']] = $val['roomName'];  
    }
    //echo '<pre>'; print_R($res);
    ksort($res);
    $res = array_unique($res);
    //echo '<pre>'; print_R($res);
    //echo '<pre>'; print_R();
    $resultArrFinal = [];
    foreach($mergedArr as $key=>$val){
        foreach($res as $k=>$v){
            if(in_array($k,$val) && in_array($v,$val)){
                $resultArrFinal[] = $val;       
            }
        }
     //echo $val['roomRate'].'   '.$val['roomName'];
    }
    
    echo '<pre>'; print_R($resultArrFinal);
    

    如果您想要完全唯一的记录,请在末尾添加此行。

    function super_unique($array,$key)
    {
       $temp_array = array();
       foreach ($array as &$v) {
           if (!isset($temp_array[$v[$key]]))
           $temp_array[$v[$key]] =& $v;
       }
       $array = array_values($temp_array);
       return $array;
    }
    
    echo '<pre>'; print_R(super_unique($resultArrFinal,'roomName'));
    

    希望对你有帮助:)

    【讨论】:

    • 它没有正确比较记录。比较背后的逻辑是我们比较第一个房间名称是否匹配,然后检查其房间计划,如果它们匹配,然后检查那里以最低价格对房间进行评分我们必须显示数组 1 和数组 2 中的其他剩余房间。请检查您的输出和我的输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2018-08-20
    • 2020-07-16
    • 2013-11-06
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多