これは私が機能する関数を作成した興味深い状況ですが、誰かがこれを行うためのより簡単な方法を持っているかどうか疑問に思っています。
次の多次元配列があります。
$foo = array(
[0] => array(
'keys' => array(
'key1' => 1,
'key2' => a,
'key3' => 123
),
'values' => array(
//goodies in here
)
)
[1] => array(
'keys' => array(
'key1' => 1,
'key2' => b,
'key3' => 456
),
'values' => array(
//goodies in here
)
)
)
私が望んでいたのは、これを配列の値に基づいてネストされた多次元配列に変換するkeys
ことでした。私が探していた出力は次のとおりです。
$bar = array(
[1] => array(
[a] => array(
[123] => array( //values array from above )
),
[b] => array(
[456] => array( //values array from above )
)
)
)
キーは配列内の位置に基づいて常にネストできますkeys
が、キー自体は常に同じであるとは限らずkeys
、ユーザー定義のグループ化を処理するため、順序と値が変わる可能性があります。また、重複したキーも必要ありませんでした。
array_merge
多くの場合、配列キーは実際には数値 ID であるため、失敗しました。それで、この機能は機能しますが、新しい手袋を自分で作ったかどうか疑問に思っています。
protected function convertAssociativeToMulti( &$output, $keys, $value )
{
$temp = array();
$v = array_values( $keys );
$s = sizeof( $v );
for( $x = 0; $x < $s; $x++ )
{
$k = $v[ $x ];
if ( $x == 0 )
{
if ( !array_key_exists( $k, $output ) )
$output[ $k ] = array();
$temp =& $output[ $k ];
}
if ( $x && ( $x + 1 ) !== $s )
{
if( !array_key_exists( $k, $temp ) )
$temp[ $k ] = array();
$temp =& $temp[$k];
}
if ( ( $x + 1 ) == $s )
$temp[$k] = $value;
}
}
$baz = array();
foreach( $foo as $bar )
{
$this->convertAssociativeToMulti( $baz, $bar['keys'], $bar['values'] );
}
では、これをより簡単に/リファクタリングするにはどうすればよいですか?