2013-02-25 24 views
0

我通過它可以具有信息像這樣一個電子表格循環:棘手的foreach循環...如何?

To     From 
LAX/SAF/ORL   ORL/SAF 
LAX/DUB    DUB/SAF 
SAF/LON    LON/BNE/SYD 

我通過這個信息需要循環,所以我得到的東西,像這樣:

Result 1: Lax -> Orl 
Result 2: Lax -> Saf 
Result 3: Saf -> Orl 
Result 4: Saf -> Saf 
Result 5: Orl -> Orl 
Result 6: Orl -> Saf 

這裏是我到目前爲止:

$row = "LAX/SAF/ORL"; 
$row2 = "ORL/SFO"; 
preg_match_all('([A-Za-z]+)', $row, $matches); 
foreach ($matches[0] as $location_to){ 
    echo $location_to . " -> " . $row2 . "<br />"; //currently doesn't loop through row2 
} 

我該怎麼做,但對於這兩組數據?我目前堅持如何種類.. foreach兩次像上面得到我需要的輸出。

任何幫助將不勝感激(這需要運行一個循環,因爲它是一個電子表格上的一行,並有其他分配的數據給它)。

它基本上是一個多旅行條目的東西。

感謝

+0

不應$行是$山坳? – 2013-02-25 01:16:42

+0

Latox - 'preg_match'對於這個目的是低效的(儘管我從你現在的答案中知道你已經知道了^^)。 @ user1389596真的嗎?去爭論語義和變量命名?如果你想成爲技術人員,那將是一個'領域',而不是一個專欄。對你發佈的內容保持建設性。 – Jon 2013-02-25 01:25:22

+0

@Jon我不清楚這些是否真的是交替的數據行。 – 2013-02-25 03:06:05

回答

3

根據你所擁有的,請嘗試:

$row = "LAX/SAF/ORL"; 
$row2 = "ORL/SFO"; 
$arow = explode("/", $row); 
$arow2 = explode("/", $row2); 
foreach($arow as $p1) { 
    foreach($arow2 as $p2) { 
     echo "$p1 -> $p2 <br>"; 
    } 
} 

這將創建一個輸出的您正在尋找的,因爲你已經知道什麼$row$row2是^^

1
  1. 如果,如果你能
  2. 爲什麼正則表達式以S電子表格它讀成CSV?僅僅指剛發生爆炸/

所以後來是這樣的:

$file = fopen('/path/to/file.csv', 'r'); 
// skip headers 
fseek($file, 1); 

while($row = fgetcsv($file)) { 
    $from = explode('/', $row[0]); 
    $to = explode('/', $row[1]); 

    foreach($from as $i => $sender) { 
     $recipient = isset($to[$i]) ? $to[$i] : 'undefined'; 
     echo "$sender -> $recipient"; 
    } 
} 
+0

剛剛投票表示感謝您的時間,並擺脫那種骯髒的投票! – Latox 2013-02-25 01:47:53

0

你可以使用一個嵌套的foreach循環,並在$ 2行的比賽,就像這樣:

$row = "LAX/SAF/ORL"; 
$row2 = "ORL/SFO"; 
$to_locations = explode('/', $row); 
$from_locations = explode('/', $row2); 
foreach ($to_locations as $to){ 
    foreach ($from_locations as $from) { 
    echo $to . " -> " . $from . "<br />"; 
    } 
} 
+1

好神,不要用'preg_match'來做這個... – Jon 2013-02-25 01:13:38

+1

我簡直就是抄襲了OP的東西。目前我正在努力改進它。 – adamdunson 2013-02-25 01:15:20

+0

有人會在今天晚上的投票中觸發快樂。我放入我的兩顆子彈,保存起來,然後開始編輯,放入代碼示例中,當我再次保存時,我有一個downvote。 – prodigitalson 2013-02-25 01:18:06

1

你實際上相當接近。我會做這樣:

$row = "LAX/SAF/ORL"; 
$row2 = "ORL/SFO"; 
$from = explode('/', $row); 
$to = explode('/', $row2); 

foreach ($from as $f){ 
    foreach($to as $t) { 
     echo $f . " -> " . $t . "<br />"; 
    } 
} 

編輯:您可能需要增加一個檢查爲if ($f == $t),因爲ORL - > ORL並沒有真正意義。 :)

+0

一樣的想法:) – mavrosxristoforos 2013-02-25 01:14:33

+0

是的ORL - > ORL很好,它是飛行位置。我現在就放棄這一點。 – Latox 2013-02-25 01:17:08

0

嘗試這種類型:

$row = "LAX/SAF/ORL"; 
$row2 = "ORL/SFO"; 

$rows = array($row, $row2); 

foreach ($rows as $row) { 
    preg_match_all('([A-Za-z]+)', $row, $matches); 
    foreach ($matches[0] as $location_to){ 
     echo $location_to . " -> " . $row2 . "<br />"; //currently doesn't loop through row2 
    } 
} 

基本上,您的代碼將執行$rows數組中的每個元素。在未來,如果您有更多的行(即文件的每一行),只需將它們添加到$rows數組中,並且代碼將遍歷每行。

+1

不要爲此使用'preg_match'。爲此目的完全沒有效率。 – Jon 2013-02-25 01:15:01

+0

我建立在問題中的代碼之上,您應該在問題上發表您的評論,而不是 – KaeruCT 2013-02-25 01:17:01

+0

誠然,您基於問題中的代碼構建,但您只是「使其工作」而不是改進它。雖然這個評論也屬於這個問題,但每個使用相同方法的答案都應該得到相同的評論。 ;) – Jon 2013-02-25 01:19:12

0
$row = "LAX/SAF/ORL"; 
$row2 = "ORL/SFO"; 
$first_array = explode('/', $row); 
$second_array = explode('/', $row2); 
$result_array = array(); 
$assoc_array = array(); 
foreach($first_array as $value1) { 
    foreach($second_array as $value2) { 
    $assoc_array[$value1] = $value2; 
    $result_array[] = $value1.' -> '.$value2; 
    } 
} 

,這將導致你要麼關聯數組,如果你希望,或一個數組,將在LAX形式的字符串 - > ORL