【问题标题】:PHP - Handle for loops for multiple arrays to form a stringPHP - 处理多个数组的循环以形成字符串
【发布时间】:2017-09-12 22:31:06
【问题描述】:

我有两个多维数组:

$rows=[{"id":9,"auditorium_id":10,"row_name":"A","row_seats_no":56,"seat_price":140,.....},{....}]

对于每个 $row,该行还有另一个 $spaces 数组:

$spaces = [{"id":1,"row_id":9,"starts_at":31,"ends_at":35,"deleted_at":null},{"id":11,"row_id":9,"starts_at":21,"ends_at":25,"deleted_at":null},{"id":21,"row_id":9,"starts_at":10,"ends_at":17,"deleted_at":null}]

我尝试创建一个字符串来描述要返回给 JavaScript 的每行​​中的座位和空间,例如对于“A”行,应该返回这样的字符串:

'AAAAAAAA____AAAAAAAA____AAAAAAAAA', 'row-B', 'row-C', etc...

其中'A' char 代表座位,'_' 代表空白。

这是我的代码:

foreach ($auditorium->seatRows as $key => $row) { // inside single row

        $map = $map."'";
        $rowSpaces = RowSpace::where('row_id', '=', $row->id)->get();

        for($i = 1; $i <= $row->row_seats_no; $i++){ // print seat or space, where $i = column_number
            foreach ($rowSpaces as $spaceKey => $rowSpace) {
                if($i > $rowSpaces[$spaceKey]->starts_at && $i < $rowSpaces[$spaceKey]->ends_at)
                {
                    $map = $map."_";
                }
            }

            if($i <= $rowSpaces[$spaceKey]->starts_at || $i > $rowSpaces[$spaceKey]->ends_at)
            {
                $map = $map."{$row->row_name}[{$row->row_name}$i]";
            }

        }

        $map = $map."',";

        $seats = $seats."{$row->row_name}:{'price': {$row->seat_price}, 'classes': '{$row->seatClasses}', 'category': 'VIP'},";

        array_push($rows, $row->row_name);

    }

我的问题是如何遍历每个座位(for 循环中的 $i),并知道它是座位还是空格。

for($i = 1; $i <= $row->row_seats_no; $i++){ // print seat or space, where $i = column_number
            foreach ($rowSpaces as $spaceKey => $rowSpace) {
                if($i > $rowSpaces[$spaceKey]->starts_at && $i < $rowSpaces[$spaceKey]->ends_at)
                {
                    $map = $map."_";
                }
            }

            if($i <= $rowSpaces[$spaceKey]->starts_at || $i > $rowSpaces[$spaceKey]->ends_at)
            {
                $map = $map."{$row->row_name}[{$row->row_name}$i]";
            }

        }

非常感谢任何帮助

【问题讨论】:

  • $rows 和 $spaces 的长度是否相同。对于每个 $row 都有一个 $space,反之亦然。
  • 每排座位的总数是否相同?
  • @KrisRoofe 不,$rows 和 $spaces 的长度不同
  • @KrisRoofe 不是每个 $row 都有相同数量的座位,也不是相同数量的 $spaces 。当用户输入这些值时,我不能保证。

标签: php laravel for-loop foreach


【解决方案1】:

我会做一些不同的事情。而不是每个座位都搜索它是否是空的。我会假设没有一个是空的,创建所有座位的数组,它们只替换该数组中的空座位。这未经测试,但类似于:

$return = array();
foreach ($auditorium->seatRows as $key => $row) { // inside single row

    $seatArray = array();

    // CREATING ALL SEATS
    for($i = 1; $i <= $row->row_seats_no; $i++){
        $seatArray[$i] = $row->row_name;
    }

    // CHANGING EMPTY SEATS
    foreach ($rowSpaces as $spaceKey => $rowSpace) {
        // NOT SURE YOU WANT > OR >=
        for($i = $rowSpaces[$spaceKey]->starts_at; $i < $rowSpaces[$spaceKey]->ends_at; $i++)
            $seatArray[$i] = "_";
    }

    $rowSpaces = RowSpace::where('row_id', '=', $row->id)->get();

    // ADDING TO RESULT
    $return[] = implode("", $seatArray);

    $seats = $seats."{$row->row_name}:{'price': {$row->seat_price}, 'classes': '{$row->seatClasses}', 'category': 'VIP'},";

    array_push($rows, $row->row_name);

}
$map = implode(", ", $return);

代码有一些错误(纠正了一些)。我现在用这个进行了测试。将对象更改为数组,因此我不必创建对象和函数。

$data=[["id"=>9,"auditorium_id"=>10,"row_name"=>"A","row_seats_no"=>56,"seat_price"=>140],["id"=>910,"auditorium_id"=>10,"row_name"=>"B","row_seats_no"=>56,"seat_price"=>140]];

$spaces = [["id"=>1,"row_id"=>9,"starts_at"=>31,"ends_at"=>35,"deleted_at"=>null],
            ["id"=>11,"row_id"=>9,"starts_at"=>21,"ends_at"=>25,"deleted_at"=>null],
            ["id"=>21,"row_id"=>9,"starts_at"=>10,"ends_at"=>17,"deleted_at"=>null]];

$return = array();
foreach ($data as $key => $row) { // inside single row

    $seatArray = array();

    // CREATING ALL SEATS
    for($i = 1; $i <= $row['row_seats_no']; $i++){
        $seatArray[$i] = $row['row_name'];
    }

    // CHANGING EMPTY SEATS
    foreach ($spaces as $spaceKey => $rowSpace) {
        // NOT SURE YOU WANT > OR >=
        for($i = $rowSpace['starts_at']; $i < $rowSpace['ends_at']; $i++)
            $seatArray[$i] = "_";
    }

    // ADDING TO RESULT
    $return[] = implode("", $seatArray);

    $seats = $seats."{$row->row_name}:{'price': {$row->seat_price}, 'classes': '{$row->seatClasses}', 'category': 'VIP'},";


}
$map = implode(", ", $return);

echo $map;

我只是不确定 $spaces 数据中是否有任何与 row_seat 相关的内容。是行号吗?如果是这样,它需要一个 if 来检查 foreach 循环中的空格。

【讨论】:

  • 感谢您的回答,但您首先将所有座位添加到 $seatArray,然后将空格添加到同一个数组。我想遍历座位(你的第一个 for 循环,其中 $i 是座位号),并检查这个位置是否存在座位或空间?
  • 后面不添加空座位,应该用空座位替换已填充的座位。为您提供相同的最终结果。
  • 刚刚使用我测试的工作示例进行了编辑。但需要更多信息来完成它。它缺少空格和行关系。
【解决方案2】:

这是代码,

foreach($rows as $row)
{
  foreach($row as $seat)
  {
    $arr[$seat['id'] - 1][$seat['row_seats_no'] - 1] = $seat['row_name'];
  }
}
foreach($spaces as $row)
{
  foreach($row as $seat)
  {
    foreach(range($seat['starts_at'] - 1, $seat['ends_at'] - 1) as $index)
    {
      $arr[$seat['row_id'] - 1][$index] = '_';
    }
  }
}
$results = array_map(function($v){return implode($v);}, $arr);

【讨论】:

  • 对于每个 $row 都有 $spaces 数组,所以我无法在 foreach($rows as $row) 之外获取 $spaces 数组
  • 你能简化你的答案吗
【解决方案3】:

我这样解决了这个问题:

    $rowsArray = [];
    $seatsArray = [];

    foreach ($this->seatRows as $key => $row) { // inside single row
        $rowSpaces = RowSpace::where('row_id', '=', $row->id)->get();
        for($i = 1; $i <= $row->row_seats_no; $i++){ // print seat or space
            foreach ($rowSpaces as $spaceKey => $rowSpace) { // inside space object
                if($i > $rowSpace->starts_at && $i < $rowSpace->ends_at)
                {
                    for($spaceCounter = $i; $spaceCounter < $rowSpace->ends_at; $spaceCounter++){ // while in this space
                        $seatsArray["s$spaceCounter"] = "_";
                    }
                }
            }

            $seatsArray[$i] = "$row->row_name$i";

        }

        $rowsArray[$row->row_name] = $seatsArray;

    }

    // $rowsArray now contain each row with seats and spaces

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 2012-04-03
    • 2020-02-06
    • 2014-04-02
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多