从二维数组中获取第一个符合条件的整行

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

我有这个数组(为了可读性而缩短):

$players = [
    ["account_id" => 4294967295, "kills" => 0, "deaths" => 0, "assists" => 0],
    ["account_id" => 101863674, "kills" => 2, "deaths" => 1, "assists" => 3],
    ["account_id" => 112698809, "kills" => 5, "deaths" => 0, "assists" => 7],
];

我正在尝试搜索具有特定

account_id
的行,以便获取该玩家的
kills
deaths
assists
的值。这是我尝试过的:

function searchForPlayer($id, $array) {
    foreach ($array as $key => $val) {
        if ($val['account_id'] === $id) {
            return $key;
        }
    }
    return null;
}
    
$player = searchForPlayer($accountid, $players);

但是它每次都会返回

null

php arrays multidimensional-array filter
3个回答
1
投票
function searchForPlayer($id, $array) {
    foreach ($array as $key => $val) {
        if ($val['account_id'] == $id) {
           return $key;
        }
    }
    return null;
}

编辑:根据您编辑的数组结构,您可以调用主数组中每个元素的方法。

function mainSearchForPlayer($id, $mainArray) {
    foreach($array as $k => $val) {
      $result = searchForPlayer($id, $val);
      if($result) break;
    }
    return $result;
}

然后致电:

$player = mainSearchForPlayer($accountid, $array);

=== 在 php 中也按类型进行比较,这意味着如果您传递 '1' 并且数组中的 id 是 1 ,则永远不会等于

否则您可以通过以下方式检查类型:

var_dump($accountid);

如果这是一个字符串值,你可以解析为int:

$accountid = intval($accountid)

0
投票

尝试这个递归函数:

function array_searchRecursive($needle, $haystack, $path=array()) {
    foreach( $haystack as $key => $val ) {
        if( is_array($val) &&  $sub = array_searchRecursive($needle, $val, $path)) {
            $path = array_merge($path, array($key), $sub);
            return $path;
        } elseif($val == $needle) {
            $path[] = $key;
            return $path;
        }
    }
    return false;
}

0
投票

使用 PHP8.4 的

array_find()
功能,您不再需要手动编写条件断循环来高效搜索数组值。

此本机函数返回第一个限定数组值(在本例中为整行),或者如果未遇到限定值,则返回

null

代码:(演示

$accountId = 112698809;
var_export(
    array_find(
        $players,
        fn($row) => $row['account_id'] === $accountId
    )
);

输出:

array (
  'account_id' => 112698809,
  'kills' => 5,
  'deaths' => 0,
  'assists' => 7,
)
© www.soinside.com 2019 - 2024. All rights reserved.