php多维关联数组中键搜索

8ftvxx2r  于 2023-04-04  发布在  PHP
关注(0)|答案(4)|浏览(115)
$array = array(
    'the-1'=> array('name'=>'lorem','pos'=>array('top'=>'90','left'=>'80'),'zindex'=>2),
    'the-2'=> array('name'=>'ipsum','pos'=>array('top'=>'190','left'=>'180'),'zindex'=>1),
    'the-3'=> array('name'=>'lorem ipsum','pos'=>array('top'=>'20','left'=>'30'),'zindex'=>3)
);

如何检查zindex键是否存在于上述php数组中。

kupeojn6

kupeojn61#

你有一个方法叫array_key_exists。当然,如果你不知道数组的深度,你需要做一些(递归)循环。

euoag5mw

euoag5mw2#

也许你应该这样使用array_walk_recursive函数

<?php
$sweet = array('a' => 'apple', 'b' => 'banana');
$fruits = array('sweet' => $sweet, 'sour' => 'lemon');

function test_print($item, $key)
{
    echo "$key holds $item\n";
}

array_walk_recursive($fruits, 'test_print');
?>

这只是从www.example.com上获取的一个打印示例php.net,但您可以轻松地调整它以满足您的需要(例如,在回调函数中添加array_key_exist

7rfyedvj

7rfyedvj3#

我不太清楚你想要什么,这里有很多可以在zindex上运行的测试,它们都使用foreach循环和array_key_exists

如果你想检查外层数组中的每一项,看看它是否有zindex:

这将遍历每个元素,并简单地检查该元素是否具有某种zindex键。

foreach( $array as $key => $element ) {
    if( array_key_exists('zindex',$element) ) {
        echo "Key '$key' has a zindex of ".$element['zindex']."\n<br>\n";
    } else {
        echo "Fail!! Key '$key' has no zindex!\n<br>\n";
    }
}

如果你只是在寻找任何zindex键:

这个函数循环直到找到一个有zindex的元素。如果找到zindex,函数返回true,否则返回false。

function find_zindex( $array ) {
    foreach( $array as $key => $element ) {
        if( array_key_exists('zindex',$element) ) {
            echo "Key '$key' has a zindex of ".$element['zindex']."\n<br>\n";
            return true;
        }
    }
    return false;
}

if( find_zindex( $array ) ) {
    echo "A zindex was found\n<br>\n";
} else {
    echo "Fail: no zindex was found\n<br>\n";
}

如果您正在数组中查找特定的zindex值:

这个循环遍历,查找具有特定值的特定zindex。如果找到,则返回外部数组的键。否则返回null。

function find_zindex( $array, $search_key ) {
    foreach( $array as $key => $element ) {
        if( array_key_exists('zindex',$element) && $element['zindex']==$search_key ) {
            echo "Key '$key' has a zindex of ".$element['zindex']."\n<br>\n";
            return $key;
        }
    }
    return null;
}

$key = find_zindex( $array, 3 );
if( $key ) {
    echo "The zindex was found at '$key'\n<br>\n";
} else {
    echo "Fail: the zindex was not found\n<br>\n";
}

$key = find_zindex( $array, 4 );
if( $key ) {
    echo "The zindex was found at '$key'\n<br>\n";
} else {
    echo "Fail: the zindex was not found\n<br>\n";
}

如果你想要一个包含每个键的数组,并且每个键都有一个特定的zindex:

这将循环,构建一个数组,其中包含与提供的zindex搜索值匹配的每个元素。完成后,它将返回新的元素数组。如果没有找到任何东西,它将返回一个空数组,该数组将被测试为false。

function find_zindex( $array, $search_key ) {
    $result = array();
    foreach( $array as $key => $element ) {
        if( array_key_exists('zindex',$element) && $element['zindex']==$search_key ) {
            echo "Key '$key' has a zindex of ".$element['zindex']."\n<br>\n";
            $result[] = $key;
        }
    }
    return $result;
}

$key = find_zindex( $array, 3 );
if( $key ) {
    echo 'The zindex was found at:';
    print_r( $key );
    echo "\n<br>\n";
} else {
    echo "Fail: the zindex was not found\n<br>\n";
}

$key = find_zindex( $array, 4 );
if( $key ) {
    echo 'The zindex was found at:';
    print_r( $key );
    echo "\n<br>\n";
} else {
    echo "Fail: the zindex was not found\n<br>\n";
}

如果您经常尝试通过zindex查找数据,您将需要重新设计您的数组:

这创建了第二个数组,它只引用了第一个数组中的元素。如果你运行这个,你可以看到数据是共享的,因为一个赋值会在两个数组中将'name'设置为'new_name'。注意,外部数组的每个元素现在都有一个索引和一个zindex。
这里假设$array中的每个元素都有一个zindex,并且zindex的值是唯一的。如果有些元素没有zindex或者有重复的zindex,那么你需要修改一下。

$array = array(
    'the-1'=> array('name'=>'lorem','pos'=>array('top'=>'90','left'=>'80'),'index'=>'the-1','zindex'=>2),
    'the-2'=> array('name'=>'ipsum','pos'=>array('top'=>'190','left'=>'180'),'index'=>'the-2','zindex'=>1),
    'the-3'=> array('name'=>'lorem ipsum','pos'=>array('top'=>'20','left'=>'30'),'index'=>'the-3','zindex'=>3)
);

$zarray = array();
foreach( $array as &$value ) {
    $zarray[$value['zindex']] =& $value;
}
// optional: order the entries in zarray by their key
ksort($zarray)

print_r($array);
echo "\n<br>\n";
print_r($zarray);
echo "\n<br>\n<br>\n<br>\n<br>\n<br>\n";

$array['the-1']['name']='new_name';
print_r($array);
echo "\n<br>\n";
print_r($zarray);
fcg9iug3

fcg9iug34#

我的解决方案是:

function find_value_by_key($key,$array) {
        $data = array('key'=>$key,'ret'=>false);
        array_walk_recursive($array,function($v,$k) use (&$data) {
            if ($data['ret'])
                return;
            if ($k==$data['key'] and $v)
                $data['ret'] = $v;
        },$data);
        return $data['ret'];
}

在这种情况下,它返回它找到的第一个值(在您的情况下,当搜索"zindex"时,它将返回2),如果您需要在数组中返回所有值,您可以使用此函数:

function find_value_by_key($key,$array) {
    $data = array('key'=>$key,'ret'=>array());
    array_walk_recursive($array,function($v,$k) use (&$data) {
        if ($k==$data['key'] and $v)
            $data['ret'][] = $v;
    },$data);
    return $data['ret'];
}

返回[2,1,3]

相关问题