2016-12-20 10 views
1

[編集:初期の不適切な質問に対する謝罪。総書き換え]ファイル間の関数からのPHP変数の再利用

私はWordpressのサイトを持っていると私は3つの関連ファイルで探しています:。

  • のfunctions.php
  • header.phpの
  • のindex.php(header.phpのを含んでいます)

外部フィードからfunction.phpの関数で天気データを取得し、そのデータをheader.php(サイトのすべてのページ)と一度に2箇所に表示しようとしていますindex.php(2番目のinstホームページにのみ表示されます)。私は、表示する最初のインスタンスを取得することができますが、私はのfunctions.phpでは、第二のインスタンス

とのトラブルを抱えている:

$weatherData = arctic_valley_weather(); 
echo round($weatherData['airTemp']); 

:その後、header.phpの中で、

function arctic_valley_weather() { 
    function get_string_between($string, $start, $end){ 
     //here's a function that just parses the data. not important 
    } 

    $fullstring = file_get_contents('http://www.cnfaic.org/library/grabbers/nws_feed.php'); 
    $parsed = get_string_between($fullstring, 'arctic_valley,', 'marmot,'); 
    $weatherValues = explode(",",$parsed); 
    $dateTime = date_create($weatherValues[0]); 

    return array(
     'dateTime' => $dateTime, 
     'airTemp' => $weatherValues[1], 
     'relHumid' => $weatherValues[2], 
     'windSpeed' => $weatherValues[3], 
     'windDirection' => $weatherValues[4], 
     'windGust' => $weatherValues[5], 
    ); 
} 

がわかりましたこれは、正確に温度(丸められた)を示す。 "18"としましょう。驚くばかり。この1つは間違って最初のインスタンスが正常に18

を示しているにもかかわらず、「0」を示し

echo round($weatherData['airTemp']); 

:私はちょうどそれとまったく同じ結果を複製する際

トラブルは、index.phpの中で来ますそれはすべての関連データだと思います。何か飛び出す?

+0

[MVCE](https://stackoverflow.com/help/mcve)を作成してみてください。また、あなたが問題となっている問題を正確に示すコードを作成してくださいving。できるだけコードを減らして、サイト構造と一緒に再度投稿してください(どのファイルに何が含まれているか)。それが立てば、誰も何が間違っていると言うことはできません。多くのことができます。 –

+0

私が言うことの1つは、あなたが削除した部分がない限り、あなたの関数は全く動作してはならないということです。 '$ weatherValues'はどこにも定義されておらず、関数の外で定義されていればそれを使うことができません。それを使うには 'global'キーワードを使わなければなりません。そしてそれらがグローバルであれば、2番目の関数呼び出しに到達する前に何かが変更されている可能性があります。 –

+0

ありがとうございます。これはあまり良くありませんでした。私は質問をもっとはっきりと書き直しました。 (関数などにはもっと多くのものがあった)。私はまだ何かを残しているかどうかはわかりませんが、私はそうは思わない。 – Lime

答えて

1

Wordpressのように、機能本体にheader.phpが含まれているようです。つまり、header.phpを離れると、header.phpに定義されているすべての変数が範囲外になります。 index.phpfooter.phppage.phpなどの変数にはアクセスできません。もう1つの解決策は、関数を再度呼び出すことです。しかし、これはあなたの外部リソースに別の要求を行い、おそらく無駄になるでしょう。または、それをスーパーグローバル$GLOBALS配列に割り当てることができます。

この同様の記事を参照してください:

$GLOBALS['weatherData'] = arctic_valley_weather(); 
echo $GLOBALS['weatherData']; 

そして、あなたはこれを行うだろう、あなたのindex.phpファイル内:

echo $GLOBALS['weatherData']; 
だから、あなたはあなたの header.phpファイル内でこのような何かをしなければならないでしょう setting variable in header.php but not seen in footer.php

0

まず第一に、あなたはグローバル変数を使用...これは、変数の標準的な使用方法ではありません(または、あなたがやっている正確に何を知っている必要があります!)もちろん

$variable = 'level 0'; 

function test_1() { 
    $variable = 'level 1'; 
    echo $variable; 
} 

echo $variable; // will work, because $variable is set to 'level 0'. 

test_1(); // will work, because $variable is set to 'level 1' ON THE FUNCTION 

function test_2() { 
    echo $variable; 
} 

echo test_2(); // Does not work, because $variable is not set INTERNALLY ON the function 

を使用することが可能ですグローバル変数...しかし、あなたはそれをしたいです、このメソッドを除外するために、あなたのロジックとあなたのコードをリファクタリング:)

1

この本のように、
まず、あなたのfunction.phpファイル内のグローバル変数を宣言してから割り当てるいくつかを試してみてくださいthiのようなあなたのメソッドからの値s。

global $weatherData; 

function arctic_valley_weather() { 
    global $weatherData; 

    function get_string_between($string, $start, $end) { 
     //here's a function that just parses the data. not important 
    } 

    $fullstring = file_get_contents('http://www.cnfaic.org/library/grabbers/nws_feed.php'); 
    $parsed = get_string_between($fullstring, 'arctic_valley,', 'marmot,'); 
    $weatherValues = explode(",", $parsed); 
    $dateTime = date_create($weatherValues[0]); 

    $weatherData = array(
     'dateTime' => $dateTime, 
     'airTemp' => $weatherValues[1], 
     'relHumid' => $weatherValues[2], 
     'windSpeed' => $weatherValues[3], 
     'windDirection' => $weatherValues[4], 
     'windGust' => $weatherValues[5], 
    ); 
} 
header.php

index.phpこのような$weatherDataにアクセスしてみてください:

global $weatherData; 
echo round($weatherData['airTemp']); 

は、この情報がお役に立てば幸い!

関連する問題