显示此数组结果的最佳方法是什么

时间:2014-09-25 03:13:36

标签: php arrays string algorithm if-statement

我有一个multidimentionla数组

array(
    "Airportbus"=>array(
                       "NO"=>array(
                                  "from"=>"Barcelona",
                                  "to"=>"Gerona"
                                  )
                       ),
    "flight"=>array(
                    "SK455"=>array(
                                 "from"=>"Gerona",
                                  "to"=>"Stockholm",
                                  "seat"=>"3A"
                               ),
                    "SK22"=>array(
                                "from"=>"Stockholm",
                                 "to"=>"New york",
                                 "gate"=>"Gate 22",
                                 "description"=>"Baggage wiil be transfered from your last leg",
                                 "seat"=>"7B"
                               )
                  ),
  "train"=>array(
                  "78A"=>array(
                                "from"=>"Madrid",
                                 "to"=>"Barcelona",
                                 "seat"=>"45B"
                               )
                )
           );

我想打印这样的结果。

1. Take train 78A from Madrid to Barcelona. Sit in seat 45B. 
2. Take the airport bus from Barcelona to Gerona Airport. No seat assignment. 
3. From Gerona Airport, take flight SK455 to Stockholm. Gate 45B, seat 3A. Baggage drop at ticket counter 344.
4. From Stockholm, take flight SK22 to New York JFK. Gate 22, seat 7B. Baggage will we automatically transferred from your last leg.

这里的问题是

1.有些数组有更多具有不同键"gate","description"的元素。 2.在结果中打印一些附加文本,"坐在" ,"采取"

我试图用

打印结果
$message = "";


if(issset($result['key']))
{
  $message += " some text ".$result['key']. " some text ",
}
if(issset($result['key2']))
{
  $message += " some text ".$result['key2']. " some text ",
}
if(issset($result['key2']))
{
  $message += " some text ".$result['key2']. " some text ",
}

我认为如果效率低下,因为每次添加新数组键时我都要添加更多代码。

在这样的情况下还有更好的方法吗,请帮忙。在此先感谢:)

3 个答案:

答案 0 :(得分:1)

我希望这张草图能让你到达某个地方

$out='';
foreach($resut as $k=>$v){
if($k=='Airportbus'){
//process bus
}

if($k=='Train'){
//process train
foreach($v as $kk=>$vv){

$trainid=$kk;
$from=$v[$kk]['from'];
$to=$v[$kk]['to'];
$seat=$v[$kk]['seat'];
$out .='you sit in.'$seat.' from '.$from.' to '.$to.' on train: '.$trainid;                               
}
}

} 

替代创建函数:

function train($data){
 foreach($data as $kk=>$vv){

    $trainid=$kk;
    $from=$v[$kk]['from'];
    $to=$v[$kk]['to'];
    $seat=$v[$kk]['seat'];
    $out .='you sit in.'$seat.' from '.$from.' to '.$to;                               
    }

return $out;

}

答案 1 :(得分:1)

这可能会做你需要的(至少足够接近):

$transport_data = YOUR_DATA;

$count = 1;
foreach ($transport_data as $transport_type => $transports) {
    foreach($transports as $transport_id => $transport_details) {
        echo $count . "." . " Take " . $transport_type . " " . $transport_id . " ";
        echo "from " . $transport_details['from'] . " to " . $transport_details['to'] . ". ";

        echo "Seating is ";
        if(array_key_exists('seat', $transport_details)) { // if seat exists, display it
            echo "Seat " . $transport_details['seat'] . ". ";
        } else {
            echo "not assigned. ";
        }

        echo "Gate is ";
        if(array_key_exists('gate', $transport_details)) { // if gate exists, display it
            echo $transport_details['gate'] . ". ";
        } else {
            echo "not assigned. ";
        }

        if(array_key_exists('description', $transport_details)) { // if description exists, display it
            echo $transport_details['description'] . ". ";
        } 
        echo  "\n";
        $count = $count + 1;
    }
}

输出:

1. Take Airportbus NO from Barcelona to Gerona. Seating is not assigned. Gate is not assigned. 
2. Take flight SK455 from Gerona to Stockholm. Seating is Seat 3A. Gate is not assigned. 
3. Take flight SK22 from Stockholm to New york. Seating is Seat 7B. Gate is Gate 22. Baggage wiil be transfered from your last leg. 
4. Take train 78A from Madrid to Barcelona. Seating is Seat 45B. Gate is not assigned.  

答案 2 :(得分:0)

我的程序解决方案没有验证或评论:

<?php

function printDefaultTransportation($properties) {
    $type = $properties['type'];
    $from = $properties['from'];
    $to   = $properties['to'];
    $id   = isset($properties['id']) ? $properties['id'] : null;
    $seat = isset($properties['seat']) ? $properties['seat'] : null;

    echo "Take $type";
    if( $id !== null ) {
        echo " $id";
    }
    echo " from $from to $to.";
    echo isset($seat) ? " Sit in $seat." : ' No seat assignment.';
}

function printAirportTransportation($properties) {
    $id   = $properties['id'];
    $from = $properties['from'];
    $to   = $properties['to'];
    $seat = isset($properties['seat']) ? $properties['seat'] : null;
    $gate = isset($properties['gate']) ? $properties['gate'] : null;
    $description = isset($properties['description']) ? $properties['description'] : null;

    echo "From $from Airport, take flight $id to $to.";
    if( $gate !== null ) {
        echo " $gate";
        if( $seat !== null ) {
            echo ", seat $seat";
        }
        echo '.';
    } else if( $seat !== null ) {
        echo " Seat $seat.";
    }
    if( $description !== null ) {
        echo " $description.";
    }
}

function printTransportation($type, $id, $extra) {
    static $functionsTypesMap = ['train'      => 'printDefaultTransportation',
                                 'airportbus' => 'printDefaultTransportation',
                                 'flight'     => 'printAirportTransportation'];

    $properties = array_merge(['type' => $type, 'id' => $id], $extra);
    call_user_func($functionsTypesMap[$type], $properties);
}

function printTransportations(array $transportations) {
    foreach($transportations as $k => $v) {
        $transportations[strtolower($k)] = $v;
    }

    $i = 1;
    static $orderedTypes = ['train', 'airportbus', 'flight'];
    foreach($orderedTypes as $type) {
        if( !isset($transportations[$type]) ) {
            continue;
        }

        foreach($transportations[$type] as $id => $properties) {
            if( $i > 1 ) {
                echo "\n";
            }
            echo "$i. ";
            printTransportation($type,
                                (strtolower($id)==='no'? null : $id),
                                $properties);
            ++$i;
        }
    }
}

$arr = ["Airportbus" => ["NO" => ["from" => "Barcelona",
                                  "to"   => "Gerona"]],
        "flight"     => ["SK455" => ["from" => "Gerona",
                                     "to"   => "Stockholm",
                                     "seat" => "3A"],
                         "SK22"  => ["from" => "Stockholm",
                                     "to"   => "New york",
                                     "gate" => "Gate 22",
                                     "description" => "Baggage wiil be transfered from your last leg",
                                     "seat" => "7B"]],
        "train"      => ["78A" => ["from" => "Madrid",
                                   "to"   => "Barcelona",
                                   "seat" => "45B"]]
];

printTransportations($arr);

输出结果为:

 1. Take train 78A from Madrid to Barcelona. Sit in 45B.
 2. Take airportbus from Barcelona to Gerona. No seat assignment.
 3. From Gerona Airport, take flight SK455 to Stockholm. Seat 3A.
 4. From Stockholm Airport, take flight SK22 to New york. Gate 22, seat 7B. Baggage wiil be transfered from your last leg.

评论:

  • “SK455航班”缺少登机口,因为输入没有。
  • “纽约”输出为“纽约”(它来自数组值)。
  • 我认为,不应该使用数组,而应该使用类。