多次元のPHPの配列があります。動的に生成されるため、任意の数のレベルを持つことができます。配列に含まれる配列はどれも空ではなく、すべてにキーが設定されています。
すべての配列キーを新しい配列に入れる方法を探しています。単層配列でそれを行う方法は知っていますが、配列がいくつのレベルになるかわからないため、行き詰まります。単層配列自体または20レベルの多次元配列である可能性がありますか?
ありがとう...
この特定のアプリケーションでは、配列の代わりにクラスを使用します。私がそれを言う理由は、それにアクセスするためにクラスに再帰関数を持つことができるので、複数のレベルを処理することがはるかに簡単になるからです。これが私が話していることの一般的な例です:
class Node {
public $children = array();
public $key;
public function get_element_by_key($search_key){
if($this->key == $search_key) return $this;
foreach ($this->children as &$child) {
if($child->get_element_by_key($search_key) != NULL){
return $child;
}
else return NULL;
}
}
}
要素を追加する関数、要素を作成して親に追加するコンストラクターなどを追加することもできます。次に、関数get_element_by_key()
(または同様の関数)を使用して要素にアクセスします。ちなみに、私はこのコードを試したことがなく、要点を説明するために書いただけです。私はあなたがそれを動かすことができるに違いない!
$ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($myArray), RecursiveIteratorIterator::SELF_FIRST);
$keys = array();
foreach ($ritit as $leafValue) {
foreach (range(0, $ritit->getDepth()) as $depth) {
$keys[] = $ritit->getSubIterator($depth)->key();
}
}
print_r(array_unique($keys));
RecursiveIteratorIterator::SELF_FIRST
この場合(すべてのサブ配列に少なくとも1つの要素がある場合)は必要ありませんが、適切な測定のためにフラグを追加しました。実際、この場合、フラグがない方が効率的です。
あなたの質問を完全に理解できるかどうかはわかりません。多次元キーを1次元配列に格納する場合は、それらをエンコードする方法が必要になります。次に、「深層」構造全体をウォークし、リーフノードごとにエンコードされたキーをリストに追加します。
配列を複製したいだけの場合は、基本的に同じことが当てはまります。配列をトラバースするか、コピーを作成するか、PHP参照配列のディープコピーで説明されているようなディープコピー関数を使用する必要があります。
あなたが見逃しているかもしれない部分は、多次元配列が単なる配列の配列であるということです。oreillyのphp本の良いもの
すべてのキーを新しい配列の値として収集する場合は、次のように機能するはずです。
// Function to recursively gather keys
function getKeys(&$keyArray, $parentArray) {
if (!is_array($parentArray) || count($parrentArray) === 0) {
return;
}
foreach ($parentArray as $key => $element) {
$keyArray[] = $key;
if (is_array($element)) {
getKeys($keyArray, $element);
}
}
}
// Usage
$arrayToBeChecked = array(array(array(...
$arrayToHoldKeys;
getKeys($arrayToHoldKeys, $arrayToBeChecked);