web-dev-qa-db-ja.com

PHPの多次元配列ですべての第2レベルのキーを検索します

使用されているキーの第2レベルのリストを生成したいと思います。各レコードに同じキーがすべて含まれているわけではありません。しかし、私はすべての鍵が何であるかを知る必要があります。 array_keys()は機能せず、数値のリストのみを返します。

基本的に、Imが探している出力は次のとおりです。

action、id、validate、Base、Ebase、Ftype、Qty、Type、Label、Unit

次の形式に従う大きな多次元配列があります。

Array
(
    [0] => Array
        (
            [action] => A
            [id] => 1
            [validate] => yes
            [Base] => Array
                (
                    [id] => 2945
                )

            [EBase] => Array
                (
                    [id] => 398
                )

            [Qty] => 1
            [Type] => Array
                (
                    [id] => 12027
                )

            [Label] => asfhjaflksdkfhalsdfasdfasdf
            [Unit] => asdfas
        )

    [1] => Array
        (
            [action] => A
            [id] => 2
            [validate] => yes
            [Base] => Array
                (
                    [id] => 1986
                )

            [FType] => Array
                (
                    [id] => 6
                )

            [Qty] => 1
            [Type] => Array
                (
                    [id] => 13835
                )

            [Label] => asdssdasasdf
            [Unit] => asdger
        )
)

助けてくれてありがとう!

21
user103219
<?php

// Gets a list of all the 2nd-level keys in the array
function getL2Keys($array)
{
    $result = array();
    foreach($array as $sub) {
        $result = array_merge($result, $sub);
    }        
    return array_keys($result);
}

?>

編集:余分なarray_reverse()関数を削除しました

20
J.C. Inacio
array_keys(call_user_func_array('array_merge', $a));

すべての値をマージし、結果のキーを取得します。

foreach($bigArray as $array){    
    foreach($array as $key=>$value){
        echo $key;
    }
}

それはあなたが望むことをするはずです。

6
inkedmn

このようなものはどうですか:

$your_keys = array_keys($your_array[0]);

もちろん、これはすべてのサブ配列が同じキーを持っていることを考慮しています。この場合、必要なのは最初のサブ配列のキーのみです(すべての第1レベルのサブ配列を反復処理する必要はありません)


そして、短縮/簡略化された例として:

$your_array = array(
    array(
        'action' => 'A',
        'id' => 1,
        'base' => array('id' => 145),
    ),
    array(
        'action' => 'B',
        'id' => 2,
        'base' => array('id' => 145),
    ),
    array(
        'action' => 'C',
        'id' => 3,
        'base' => array('id' => 145),
    )
);

$your_keys = array_keys($your_array[0]);
var_dump($your_keys);

あなたを取得します:

array
  0 => string 'action' (length=6)
  1 => string 'id' (length=2)
  2 => string 'base' (length=4)

implode を使用して、要求した文字列を取得できます。

echo implode(', ', $your_keys);

あなたを取得します:

action, id, base

つまり、最初のサブアレイのキーのリストです。

5
Pascal MARTIN

一発ギャグ:

$keys=array_unique(array_reduce(array_map('array_keys',$data),'array_merge',[]));

または関数内:

function get_array_children_keys($data) {
    return array_unique(
        array_reduce(array_map('array_keys', $data), 'array_merge', [])
    );
}

これを例で分解してみましょう。ここにいくつかのサンプルデータがあります。

[
    ['key1' => 0],
    ['key1' => 0, 'key2' => 0],
    ['key3' => 0]
]

最も内側の関数から始めて、array_keys関数を使用してarray_mapを実行します。

array_map('array_keys', $data)

これにより、すべての子配列からのキーが得られます

[
    ['key1'],
    ['key1', 'key2'],
    ['key3']
]

次に、array_mergeコールバックと空の配列を初期値として使用して、データに対してarray_reduceを実行します。

array_reduce(..., 'array_merge', []);

これにより、複数の配列が1つのフラット配列に変換されます。

[
    'key1',
    'key1',
    'key2',
    'key3'
]

次に、array_uniqueを使用して重複を取り除きます。

array_unique(...)

そして、すべてのキーで終わります:

[
    'key1',
    'key2',
    'key3'
]
4
Sy Holloway

@raise Answersはショートカットを提供しますが、数値キーでは失敗します。以下はこれを解決するはずです:

_$secondKeys=array_unique(call_user_func_array('array_merge', array_map('array_keys',$a)));
_

array_map('array_keys',$a):キーを取得しながらループします

_...'array_merge'..._:キ​​ー配列をマージします

_array_unique(..._ :(オプション)一意のキーを取得します。

私はそれが誰かを助けることを願っています。

更新:

または、

_$secondKeys=array_unique(array_merge(...array_map('array_keys', $a)));
_

それは上記と同じ答えを提供し、はるかに高速です。

1
McAngujo
function  __getAll2Keys($array_val){
        $result = array();
        $firstKeys = array_keys($array_val);
        for($i=0;$i<count($firstKeys);$i++){
            $key = $firstKeys[$i];
            $result = array_merge($result,array_keys($array_val[$key]));
        }
        return $result;
    }

この機能を試してください。思い通りに戻ります。

1
kinderjit singh

この関数を使用すると、多次元配列からすべてのキーを取得できます

function arrayKeys($array, &$keys = array()) {        
        foreach ($array as $key => $value) {
            $keys[] = $key;
            if (is_array($value)) {                
                $this->arrayKeys($value, $keys);
            }
        }
        return $keys;
}
0
Giovani

私の提案は、 この回答 に似ていますが、より高速で スプレッド演算子 (PHP 5.6+)を使用しています。

array_merge(...array_values($fields))

名前を配列値に移動し、キーを0..nにリセットする場合は、最後の手順で_array_keys_を使用します。

array_keys(array_merge(...array_values($fields)))

0

たぶん、array_map関数を使用できます。これにより、配列の反復を回避し、必要なキーを値として持つ配列を返すことができます。

このようになります

$newArray = array_map(function($value){return array_keys($value);},$yourArray);

var_dump($newArray);

array (size=2)
  0 => 
    array (size=9)
      0 => string 'action' (length=6)
      1 => string 'id' (length=2)
      2 => string 'validate' (length=8)
      3 => string 'Base' (length=4)
      4 => string 'EBase' (length=5)
      5 => string 'Qty' (length=3)
      6 => string 'Type' (length=4)
      7 => string 'Label' (length=5)
      8 => string 'Unit' (length=4)
  1 => 
    array (size=9)
      0 => string 'action' (length=6)
      1 => string 'id' (length=2)
      2 => string 'validate' (length=8)
      3 => string 'Base' (length=4)
      4 => string 'FType' (length=5)
      5 => string 'Qty' (length=3)
      6 => string 'Type' (length=4)
      7 => string 'Label' (length=5)
      8 => string 'Unit' (length=4)
0
snaphuman

すべてのレコードが同じキーを持っている場合のみ次のことができます:

_$firstItem = reset($array);
$keys = array_keys($firstItem);
_

明らかに、これは、レコードのキーが異なるこの特定の質問に対する正しい答えではありません。しかし、これは、すべてのキーが同じである配列から第2レベルのキーを取得する方法を探すときに見つける質問かもしれません(私はそうしました)。すべてのレコードに同じキーがある場合は、配列の最初の項目をreset()で使用し、最初の項目からarray_keys()でキーを取得できます。

0
Dirk J. Faber