使用されているキーの第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
)
)
助けてくれてありがとう!
<?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()関数を削除しました
array_keys(call_user_func_array('array_merge', $a));
すべての値をマージし、結果のキーを取得します。
foreach($bigArray as $array){
foreach($array as $key=>$value){
echo $key;
}
}
それはあなたが望むことをするはずです。
このようなものはどうですか:
$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
つまり、最初のサブアレイのキーのリストです。
一発ギャグ:
$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'
]
@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)));
_
それは上記と同じ答えを提供し、はるかに高速です。
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;
}
この機能を試してください。思い通りに戻ります。
この関数を使用すると、多次元配列からすべてのキーを取得できます
function arrayKeys($array, &$keys = array()) {
foreach ($array as $key => $value) {
$keys[] = $key;
if (is_array($value)) {
$this->arrayKeys($value, $keys);
}
}
return $keys;
}
たぶん、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)
すべてのレコードが同じキーを持っている場合のみ次のことができます:
_$firstItem = reset($array);
$keys = array_keys($firstItem);
_
明らかに、これは、レコードのキーが異なるこの特定の質問に対する正しい答えではありません。しかし、これは、すべてのキーが同じである配列から第2レベルのキーを取得する方法を探すときに見つける質問かもしれません(私はそうしました)。すべてのレコードに同じキーがある場合は、配列の最初の項目をreset()
で使用し、最初の項目からarray_keys()
でキーを取得できます。