13

私は多次元配列を持っています、例えば:

$values = array(
    'one' => array(
        'title' => 'Title One',
        'uri'   => 'http://example.com/one',
    ),
    'two' => array(
        'title' => 'Title Two',
        'uri'   => 'http://example.com/two',
    ),
);

implode...そして、関数のクロージャーを使用してそれを解析したいと思います。

$final_string = implode(' | ', function($values) {
    $return = array();

    foreach($values as $value)
        $return[] = '<a href="' . $value['uri'] . '">' . $value['title'] . '</a>';

    return $return;
});

ただし、この使用法ではInvalid arguments passedエラーが発生します。このクロージャーの使用を可能にする、私が見逃している構文はありますか? PHP v5.3.16 を使用しています。

4

5 に答える 5

27

使用array_map:

$final_string = implode(' | ', array_map(function($item) {
    return '<a href="' . $item['uri'] . '">' . $item['title'] . '</a>';
}, $values));

実際のコードでは、値を HTML として適切にエスケープできると思います。


これが機能し、コードが機能しない理由については、関数を の 2 番目の引数として渡していましたimplode。率直に言って、それはあまり意味がありません。文字列の束、または関数の束を結合することはできますが、単一の関数を結合することはできません。特にそのように言うと、奇妙に聞こえます。

代わりに、まず関数を使用して配列内のすべての項目を変換し、その結果を に渡しますimplode。この操作は、最も一般的に と呼ばれmapます。幸いなことに、PHP はこの関数をarray_map. 配列内の項目を変換したら、結果を結合できます。

于 2013-06-26T03:51:35.963 に答える
5

関数を変数に割り当ててから、それを通過させて機能させる必要があるようです。

$fn = function($values) {
    $return = array();
    foreach($values as $value)
        $return[] = '<a href="' . $value['uri'] . '">' . $value['title'] . '</a>';
    return $return;
};
$final_string(' | ', $fn($values));
echo $final_string;

ただし、その理由が何であるかはわかりません。適切な理由を示すには、もう少し詳しく調べる必要があります。

ここでコードが機能しているのを見ることができます

編集:誰もがここに貢献できるように、この回答をコミュニティ wiki に変換しました。

編集:@kmfkによる説明

クロージャーをメソッドに直接渡すimplodeと (明示的に type の 2 番目の引数がarray必要な場合)、本質的にチェックされるinstanceofため、引数が無効になります。関数は型をimplode想定しmixedておらず、クロージャーを実行してarray.

その関数を最初に変数に割り当てると、PHP は最初にその変数を評価し、関数から返された値を に渡しますimplode

その場合、関数から配列を返し、それをに渡しimplodeます-それはチェックアウトします。

その無名関数はinstanceof Closure、および

Closure !== array
于 2013-06-26T03:43:38.103 に答える
2

アシュウィンの答えは正しいです。 理由は次のとおりです。

クロージャーをメソッドに直接渡すimplodeと (明示的に type の 2 番目の引数が必要なため、無効な引数がarray本質的にチェックされます)。関数は、クロージャーの実行を予期しておらず、認識していませんinstanceofimplodemixed

その関数を最初に変数に割り当てると、PHP は最初にその変数を評価し、関数から返された値を に渡しますimplode

その場合、関数から配列を返し、それをに渡しimplodeます-それはチェックアウトします。

編集/追加: その無名関数はinstanceof Closure.

Closure !== array
于 2013-06-26T03:49:58.473 に答える
0

arrayimplodeは 2 番目の引数としてのみ受け入れるため、達成しようとしているものに対して implode を使用することはできません。

このようなものを試すことができます。

$values = array(
    'one' => array(
        'title' => 'Title One',
        'uri'   => 'http://example.com/one',
    ),
    'two' => array(
        'title' => 'Title Two',
        'uri'   => 'http://example.com/two',
    ),
);

$links = array();
foreach ($values as $value) {
      $links[] = "<a href='" . $value['uri'] . "'>" . $value['title'] . "</a>";
}

$string = implode(" | ", $links);
于 2013-06-26T03:43:40.037 に答える