如何找到多维数组中某个项目最后一次出现的键?

问题描述 投票:0回答:6

我需要找到与以下数组中最后一次出现的 (id = 100001203541047) 相对应的键:

[0] => Array
        (
            [id] => 10152583762905798_10152583800415798
            [from] => Array
                (
                    [id] => 100001203541047
                    [name] => Gangareddy Chealimealla
                )

            [message] => Desi Flipkart
            [created_time] => 2014-07-30T07:30:34+0000
            [like_count] => 0
            [user_likes] =>
            [can_comment] => 1
        )

    [1] => Array
        (
            [id] => 10152583762905798_10152583786375798
            [from] => Array
                (
                    [id] => 100001430479186
                    [name] => Pratik Das
                )

            [message] => flipkart rules! (y)
            [created_time] => 2014-07-30T07:16:56+0000
            [like_count] => 0
            [user_likes] =>
            [can_comment] => 1
        )

    [2] => Array
        (

            [id] => 10152583762905798_10152583802415798
            [from] => Array
                (
                    [id] => 100001203541047
                    [name] => Gangareddy Chealimealla
                )

            [message] => Desi Flipkart
            [created_time] => 2014-07-30T08:30:34+0000
            [like_count] => 0
            [user_likes] =>
            [can_comment] => 1
        )

我尝试了以下代码,但它返回了 2 个位置。

 foreach($arr as $key => $array)
 {
     if ( $array['from']['id'] === $id)
         echo $key."\n\n";
     }
 }

为什么不只显示最后一张?

php arrays multidimensional-array
6个回答
0
投票

您已经编写的代码几乎可以工作。问题是,每次在 foreach 循环中遇到与 id 匹配的键时,它都会立即打印该键。

foreach($arr as $key => $array) {
    if ( $array['from']['id'] === $id) {
        echo $key."\n\n";
    }
}

如果您将键存储在变量中,那么循环完成后,变量中的值将是最后一个,您可以直接打印它。

$last = "";
foreach($arr as $key => $array) {
    if ( $array['from']['id'] === $id) {
        $last = $key;
    }
}
echo $last."\n\n";

0
投票

为了简单起见,您可以将它们存储在一个数组中,然后在循环之后,取最后一个。

改变

echo $key."\n\n";

$ids[] = $key

循环结束后,最后一次出现的位置将是

end($ids);

希望对您有帮助。


0
投票
// function where you can pass the id you are looking for, eg.: 100001203541047.
function findElementById($id, $arr) {
    // iterate from the back, and you get the last match.
    for ($i = count($arr) - 1; $i >= 0; $i--) {
        $array = $arr[$i];
        if($array['from']['id'] === $id)){
            return $array; // if you find the element return it.
        }
    }
    return null; // return null if not found.
}

使用示例:

$elementYouAreLookingFor = findElementById(100001203541047, $arr);

0
投票

假设数组已经排序,您可以使用 array_map 查找包含搜索变量的数组,然后只需使用 array_pop 即可获取最后的结果。

例如:此函数仅返回具有 magic ID 的最后一个数组值。

$magicID = '100001203541047';
function findSame($value){
    if($value['from']['id'] == $magicID){
        return $value;
    }
}

// $values should contain your data
$values = array(array(1,'from'=>array('id'=>'100001203541047'),3), array(1,'from'=>array('id'=>'20000'),4), array(2,'from'=>array('id'=>'100001203541047'),3));
$mapping = array_pop(array_filter(array_map('findSame', $values)));
var_dump($mapping);

0
投票

这是一个有趣的(PHP >= 5.5.0):

echo array_search($id,
     array_reverse(array_column(array_column($array, 'from'), 'id'), true));

0
投票

因为您的 3d 数组具有索引的第一级,所以您可以简单地反向迭代并在遇到合格值时立即中断。这肯定是最有效的方法。

代码:(演示

$search = '100001203541047';
$found = null;
for ($i = array_key_last($array); $i >= 0; --$i) {
    if ($array[$i]['from']['id'] == $search) {
        $found = $i;
        break;
    }
}
var_export($found);

从前面迭代数组的性能较差;这将要求您的脚本始终迭代整个数组。这是在

foreach()
循环中使用数组解构语法的样子。 演示

$search = '100001203541047';
$found = null;
foreach ($array as $i => ['from' => ['id' => $id]]) {
    if ($id == $search) {
        $found = $i;  // keep overwriting the earlier value
    }
}
var_export($found);
© www.soinside.com 2019 - 2024. All rights reserved.