Php 当某些特定值与给定数组匹配时,从多维数组中删除键
我肯定我在这里只面临一个逻辑问题 我有这样一个数组:Php 当某些特定值与给定数组匹配时,从多维数组中删除键,php,multidimensional-array,array-unset,Php,Multidimensional Array,Array Unset,我肯定我在这里只面临一个逻辑问题 我有这样一个数组: var_export($myarray); array ( 0 => array ( 'inf:name' => 'aaa', 'inf:value' => '111', 'inf:children' => NULL, ), 1 => array ( 'inf:name' => 'bbb', 'inf:value' => '222',
var_export($myarray);
array (
0 =>
array (
'inf:name' => 'aaa',
'inf:value' => '111',
'inf:children' => NULL,
),
1 =>
array (
'inf:name' => 'bbb',
'inf:value' => '222',
'inf:children' => NULL,
),
2 =>
array (
'inf:name' => 'ccc',
'inf:value' => '333',
'inf:children' => NULL,
),
3 =>
array (
'inf:name' => 'bob',
'inf:children' =>
array (
0 =>
array (
'inf:name' => 'ddd',
'inf:value' => '444',
'inf:children' => NULL,
),
),
),
4 =>
array (
'inf:name' => 'data',
'inf:children' =>
array (
0 =>
array (
'inf:name' => 'eee',
'inf:value' => '555',
'inf:children' => NULL,
),
1 =>
array (
'inf:name' => 'steve',
'inf:value' => 'bar1',
'inf:children' => NULL,
),
2 =>
array (
'inf:name' => 'john',
'inf:value' => 'bar2',
'inf:children' => NULL,
),
3 =>
array (
'inf:name' => 'peter',
'inf:value' => 'bar3',
'inf:children' =>
array (
0 =>
array (
'inf:name' => 'fff',
'inf:value' => '666',
'inf:children' => NULL,
),
),
),
),
),
)
//Or using print_r()
print_r($myarray);
Array
(
[0] => Array
(
[inf:name] => aaa
[inf:value] => 111
[inf:children] =>
)
[1] => Array
(
[inf:name] => bbb
[inf:value] => 222
[inf:children] =>
)
[2] => Array
(
[inf:name] => ccc
[inf:value] => 333
[inf:children] =>
)
[3] => Array
(
[inf:name] => bob
[inf:children] => Array
(
[0] => Array
(
[inf:name] => ddd
[inf:value] => 444
[inf:children] =>
)
)
)
[4] => Array
(
[inf:name] => data
[inf:children] => Array
(
[0] => Array
(
[inf:name] => eee
[inf:value] => 555
[inf:children] =>
)
[1] => Array
(
[inf:name] => steve
[inf:value] => bar1
[inf:children] =>
)
[2] => Array
(
[inf:name] => john
[inf:value] => bar2
[inf:children] =>
)
[3] => Array
(
[inf:name] => peter
[inf:value] => bar3
[inf:children] => Array
(
[0] => Array
(
[inf:name] => fff
[inf:value] => 666
[inf:children] =>
)
)
)
)
)
)
当inf:name
与给定名称匹配时,我想删除一些键
以下是我的测试函数:
function array_cleanup( $array, $todelete )
{
foreach( $array as $key => $value )
{
if( is_array( $value ) )
{
$array[$key] = array_cleanup( $array[ $key ], $todelete );
} else {
if( sizeOf( $todelete ) > 0 )
{
if ( in_array( $value[ 'inf:name' ], $todelete ) )
unset( $array[ $key ] );
}
}
}
return $array;
}
$newarray = array_cleanup( $myarray, array("aaa", "peter", "ccc") );
所需输出必须为:
var_dump($newarray);
array (
0 =>
array (
'inf:name' => 'bbb',
'inf:value' => '222',
'inf:children' => NULL,
),
2 =>
array (
'inf:name' => 'bob',
'inf:children' =>
array (
0 =>
array (
'inf:name' => 'ddd',
'inf:value' => '444',
'inf:children' => NULL,
),
),
),
4 =>
array (
'inf:name' => 'data',
'inf:children' =>
array (
0 =>
array (
'inf:name' => 'eee',
'inf:value' => '555',
'inf:children' => NULL,
),
1 =>
array (
'inf:name' => 'steve',
'inf:value' => 'bar1',
'inf:children' => NULL,
),
2 =>
array (
'inf:name' => 'john',
'inf:value' => 'bar2',
'inf:children' => NULL,
),
),
),
)
//or using print_r();
print_r($newarray);
Array
(
[1] => Array
(
[inf:name] => bbb
[inf:value] => 222
[inf:children] =>
)
[2] => Array
(
[inf:name] => bob
[inf:children] => Array
(
[0] => Array
(
[inf:name] => ddd
[inf:value] => 444
[inf:children] =>
)
)
)
[3] => Array
(
[inf:name] => data
[inf:children] => Array
(
[0] => Array
(
[inf:name] => eee
[inf:value] => 555
[inf:children] =>
)
[1] => Array
(
[inf:name] => steve
[inf:value] => bar1
[inf:children] =>
)
[2] => Array
(
[inf:name] => john
[inf:value] => bar2
[inf:children] =>
)
)
)
)
必须重置$newarray
键。因为如果不重置,我以后可能会面临其他问题
谢谢大家。这似乎有效:
<?php
$myarray = array (
0 =>
array (
'inf:name' => 'aaa',
'inf:value' => '111',
'inf:children' => NULL,
),
1 =>
array (
'inf:name' => 'bbb',
'inf:value' => '222',
'inf:children' => NULL,
),
2 =>
array (
'inf:name' => 'ccc',
'inf:value' => '333',
'inf:children' => NULL,
),
3 =>
array (
'inf:name' => 'bob',
'inf:children' =>
array (
0 =>
array (
'inf:name' => 'ddd',
'inf:value' => '444',
'inf:children' => NULL,
),
),
),
4 =>
array (
'inf:name' => 'data',
'inf:children' =>
array (
0 =>
array (
'inf:name' => 'eee',
'inf:value' => '555',
'inf:children' => NULL,
),
1 =>
array (
'inf:name' => 'steve',
'inf:value' => 'bar1',
'inf:children' => NULL,
),
2 =>
array (
'inf:name' => 'john',
'inf:value' => 'bar2',
'inf:children' => NULL,
),
3 =>
array (
'inf:name' => 'peter',
'inf:value' => 'bar3',
'inf:children' =>
array (
0 =>
array (
'inf:name' => 'fff',
'inf:value' => '666',
'inf:children' => NULL,
),
),
),
),
),
);
function array_cleanup($array, $todelete ) {
foreach ($array as $key => $value) {
if (is_array($value)) {
if (in_array($value['inf:name'], $todelete)) {
unset($array[$key]);
} else {
$array[$key] = array_cleanup($array[$key], $todelete);
}
}
}
return $array;
}
$newarray = array_cleanup($myarray, array("aaa", "peter", "ccc"));
$newarray = array_values($newarray);
echo '<pre>';
var_export($newarray);
echo '</pre>';
?>
inf:children可以嵌套多少层?@stereofrog:check update,@thirtydot:It不应该超过四层,但我认为应该递归调用该函数,以便它可以适应任何输入。@Ajreal-是的,确实是XML数据转换成PHP数组。确实,这似乎有效。非常感谢。今晚我将对它进行进一步的测试。:)
class Arr
{
/**
* Removes all occurences of {needle} in {subject}
*
* @return array
*/
public static function purgeKey(string $needle, array $subject) : array
{
foreach ($subject as $key => $value) {
if (is_array($value)) {
$subject[$key] = static::purgeKey($needle, $value);
} else if ($key === $needle) {
unset($subject[$needle]);
}
}
return $subject;
}
}