2012-05-09 10 views
3

私はcodeigniterコントローラにメソッドを持っています。このメソッドは、urlで時々呼び出され、コントローラの別のメソッドから内部的に呼び出されることもあります。私はそれを内部的に呼び出すと、一連の引数を渡します。方法の簡略化されたバージョン:引数がcodeigniterメソッドに渡される方法

<domain>/<controller>/get_details/abcd/efgh 

又は制御装置の他の機能から:

(コントローラ内の)メソッドが呼び出されるか

function get_details($args='') { 

    if (isset($args['first_name'])) 
    { 
     $first_name = $args['first_name']; 
    } 
    else 
    { 
     $first_name = $this->uri->segment(3); 
    } 

    ... do some other stuff ... 

} 

として

$this->get_details(array('first_name'=>'abcd', 'last_name'=>'efgh')); 

私は、メソッドがurlを通して呼び出されたときに、isset($ args ['first_name'])が偽ですが、このように呼び出された議論はそこにあります。私は物事のカップルを印刷しようと、これは私が得たものである:

print_r($args) ----> abcd 

echo($args['first_name']) ----> a 

echo($args['whatever_index_I_use']) ----> a 

これは、URLの三番目のパラメータが(?CodeIgniterので)メソッドに渡されているように思えるが、なぜうまくできません配列のインデックスが設定されているように見えますが、PHPが文字列をintに変換していると思いますので、$args['whatever_index_I_use'], becomes $args[0] ??

これはCodeIgniterの事であるか、私はPHPの繊細が欠けている場合わかりません。

多くは、何が起こっているかを説明することができ、誰に感謝しています。

ありがとうございました。

+1

配列を渡す必要はありますか? '$ this-> get_details( 'abcd'、 'efgh');'メソッドを呼び出して値を渡すだけではありません。呼び出しが行われたときとまったく同じ方法でアクセスできますブラウザによって。 – cchana

+0

イセットセットを[is_array](http://php.net/manual/en/function.is-array.php)に変更するとどうなりますか? –

+0

is_array($ args)はfalseを返します。これは良いことです。私はテストのために使用できます。ありがとうございます。しかし、私はまだコードの残りの部分で何が起こっているのか理解したいのですが、PHPが文字列をどのように扱うか(引数とインデックスについて)何か不足していますか? – Leon

答えて

4

これはバグか、期待される動作ですが、Strings docsに正確にあなたが経験しているかを示すコメントがあるかどうかはわかりません。文字列のテキストとインデックスを使用すると、最初のcharが返されます。

function get_details($args='') 
{ 
    if (is_array($args)) 
    { 
     $first_name = $args['first_name']; 
    } 
    else 
    { 
     $first_name = $this->uri->segment(3); 
    } 
    ... do some other stuff ... 
} 

しかし、あなたはあなたのコードでいくつかの問題があります - これはあなたのバグを解決します

if(is_array($args)) { 
    echo($args['first_name']); 
} 
+0

ありがとう、それはそれをカバーするようだ – Leon

0

は、特にあなたの質問に答えるために:引数が配列または文字列がある場合は、それを避けるために、最初に確認してください。まず、メソッドを

<domain>/<controller>/get_details/abcd/efgh 

と呼びますが、コントローラでは "efgh"変数を受け入れません。これを行うには、あなたが今だけ

$this->get_details('abcd', 'efgh'); 

としての機能を呼び出すことができますし、今もある、配列などをテストする必要がいけない。その場合には

function get_details($first, $last) 

に機能を変更する必要がありますより良い解決策はIMOです。

使用すると、配列、変更に固執することを決定した場合:理由は、定義により

$first_name = $args; 

$first_name = $this->uri->segment(3); 

- $ argsを第3 URIセグメントです。

2

@SérgioMichelsの答えを完成させるためには、PHPが指定されたインデックスとして整数を期待しているからです。文字列を与えると、PHPは文字列を整数にキャストし、文字列が数字で始まらないと仮定すると、型キャストは0を返します。そうでなければ、先頭の数字を返します。

$str = 'abcdefghi'; 
var_dump($str['no_number']); // Outputs: string(1) "a" 
var_dump($str['3something']); // Outputs: string(1) "d" 
+1

また、PHPが配列として文字列を処理し、数値インデックスを強制すると気づかなかった - このホップでキャッチするのは簡単に これはefullyこれは誰かが同じ問題 – Leon

関連する問題