14
array(
    [0]=>
        [index1]=>something
        [index2]=>something else
        [index3]=>something more
    [1]=>
        [index1]=>something
        [index2]=>something else
        [index3]=>something more
    [2]=>
        [index1]=>something
        [index2]=>something else
        [index3]=>something more
)

編集:だから私は以下を取得したいと思います:

array(
    [0]=>
        [index1]=>something
        [index2]=>something else
    [1]=>
        [index1]=>something
        [index2]=>something else
    [2]=>
        [index1]=>something
        [index2]=>something else
)

Cakephp で Set::extract 関数を使用して配列の複数のインデックスを取得するにはどうすればよいですか?

これにより、1 つの値が取得されます。

Set::extract($array, '{n}.index1');

しかし、複数の値を取得したいと思います...たとえば、index1とindex2。

次のようなステートメントを試しましたが、役に立ちませんでした。

Set::extract($array, '[{n}.index1, {n}.index2']);

編集

    $__pages = Hash::merge(
                    Hash::extract($pages, 'pages.{n}.id'),
                    Hash::extract($pages, 'pages.{n}.title')
                    );
    pr($__pages);

出力:

Array
(
    [0] => 2
    [1] => 4
    [2] => 104
    [3] => Sample Page
    [4] => about us
    [5] => Services
)

私はまだ次のような関連付けが必要なので、それは本当に役に立ちません:

Array(
   [2] => Sample Page
   [4] => About us
   [104] => Services
)

私も満足しています:

Array(
   Array(id => 2, title => Sample Page)
   Array(id => 4, title => About Us)
   Array(id => 104, title => Services)
)

ANSWER thecodeparadox の回答は、私が提供したテスト コードで機能します。誰かがここでつまずいた場合に備えて、実際のコードを次に示します。この本では、「{n} と {s} 以外の括弧で囲まれた文字列リテラルは正規表現として解釈される」と述べています。この線は隠されているようで、あまり露骨ではありませんでした。これを知っていたので、正規表現ルールを使用して必要なデータを取得しました。API から wordpress の投稿を取得した配列があるため、結果を に絞り込む必要がありましたid, title

array(
   posts=>
      0=>
         id => 3
         slug => sample-page
         type => page
         title => Sample Page
         //...and so on 

      1=>
         id => 7
         slug => sample-page-2
         type => page
         title => Sample Page 2
         //...and so on 

ID とタイトルだけを取得するために、次の行を追加しました。

pr(Set::classicExtract($pages, 'pages.{n}.{(id|title)}'));

これは私に与えました:

array(
   posts=>
      0=>
         id => 3
         title => Sample Page

      1=>
         id => 7
         title => Sample Page 2

ドキュメント:

4

6 に答える 6

6
$arr = array(
            array(
                'index1'=>'something',
                'index2'=>'something else',
                'index3'=>'something more',
            ),
            array(
                'index1'=>'something',
                'index2'=>'something else',
                'index3'=>'something more',
            ),
            array(
                'index1'=>'something',
                'index2'=>'something else',
                'index3'=>'something more',
            )
        );

$output = Set::classicExtract($arr, '{n}.{index[1-2]}');

print_r($output);

// output


Array
(
    [0] => Array
        (
            [index1] => something
            [index2] => something else
        )

    [1] => Array
        (
            [index1] => something
            [index2] => something else
        )

    [2] => Array
        (
            [index1] => something
            [index2] => something else
        )

)
于 2012-12-15T18:24:02.323 に答える
2

1 つの方法 (少数の結果のみを保持する場合):

Hash::merge(
    Hash::extract($array, '{n}.index1'),
    Hash::extract($array, '{n}.index2')
);

別の方法 (いくつかだけを削除したい場合):

Hash::remove($array, '{n}.index3');
于 2012-12-08T23:09:23.990 に答える
1

セットは素晴らしいです!Set :: extractを使用してこれを直接行うことはできませんが、Set :: combine:を使用して2つの配列インデックスの連想配列を作成することはできます。

Set::combine($myArray, '{n}.index1', '{n}.index2')

実用的な例は次のようになります。

$myArray = array(
    array('index1'=>'something 1', 'index2'=>'something else 1', 'index3'=>'something more 1'),
    array('index1'=>'something 2', 'index2'=>'something else 2', 'index3'=>'something more 2'),
    array('index1'=>'something 3', 'index2'=>'something else 3', 'index3'=>'something more 3'),
);

debug(Set::combine($myArray, '{n}.index1', '{n}.index2'));

これはあなたが述べたような配列を取ります:

array(
[0]=>
    [index1]=>something 1
    [index2]=>something else 1
    [index3]=>something more 1
[1]=>
    [index1]=>something 2
    [index2]=>something else 2
    [index3]=>something more 2
[2]=>
    [index1]=>something 3
    [index2]=>something else 3
    [index3]=>something more 3

)。

そしてそれをこれに変えてください:

Array (
    [something1] => something else 1
    [something2] => something else 2
    [something3] => something else 3
)
于 2012-12-10T21:46:36.107 に答える
1

Set::extract($array, '{n}.{s}'); を試しましたか? ?

編集:配列の次元が回答の次元とまったく同じである場合は、array_keys(Set::extract($array, '{n}.{s}')); を試すことができます。

于 2012-11-27T14:51:06.023 に答える
1

Setなぜあなたがクラスに固執したいのかわからないのですか?それがあなたのニーズに合わない場合、なぜあなたは絶対にそれを使用し、独自の関数を作成しないのですか? foreachコメントの 1 つで、ループを回避したいと言っています。しかし、Setクラス メソッドforeach自体はループでいっぱいです。ポイントがずれてるかも…

個人的には、次のような関数で簡単に実行できます。

function filter_fields($array_to_filter, $fields_to_keep)
{
    foreach($array_to_filter as $i => $sub_array)
    {
        foreach($sub_array as $field => $value)
        {
            if(!in_array($field, $fields_to_keep))
            {
                unset($array_to_filter[$i][$field]);
            }
        }
    }

    return $array_to_filter;
}

返されるものの例を次に示します。

print_r($array_to_filter);
/*
Array
(
    [0] => Array
        (
            [index1] => abc
            [index2] => def
            [index3] => ghi
        )

    [1] => Array
        (
            [index1] => jkl
            [index2] => mno
            [index3] => poq
        )
)
*/

$filtered_array = filter_fields($array_to_filter, array('index1', 'index3'));

print_r($filtered_array);
/*
Array
(
    [0] => Array
        (
            [index1] => abc
            [index3] => ghi
        )

    [1] => Array
        (
            [index1] => jkl
            [index3] => poq
        )
)
*/
于 2012-12-09T13:41:21.823 に答える