【问题标题】:PHP Find Values from Key [closed]PHP从键中查找值[关闭]
【发布时间】:2021-02-07 01:10:11
【问题描述】:

所以,我试图了解如何做到这一点。我很难过。

$arrayChart = array(
array(
    "Name" => "Mike",
    "ID" => "0001234",
    "Hours" => 38
    ),
array(
    "Name" => "Miles",
    "ID" => "0005678",
    "Hours" => 42
    )
);

我希望能够从键值中找到小时数(整数)。问题是我想根据名字的第一个字母找到它。这意味着如果我有“M”,那么每个以“M”开头的名字我都应该输出他们一周的工作时间并将它们加在一起。

所以,我得到了“M”,我必须从中找到他们的工作时间并添加它们。我怎样才能做到这一点? 我尝试使用此功能,但它甚至没有做任何事情。

$name = "M";
foreach($arrayChart as $key){
if($key["Name"] == $name){
    $hours = $key["Hours"];
    break;
 }
}
print_r($hours);

【问题讨论】:

  • 您需要与名称的第一个字母进行比较。您还需要添加$hours (+=),而不是分配(=),并且在找到匹配项时不应该break。试试3v4l.org/NEXYI
  • 我了解您给我的其他提示和解决方案。我唯一不明白的是如何比较第一个字母。我希望能够从给定的字母中找到值。我还在学习 PHP,但我认为我还做不到。
  • $string[0] 给你$string 的第一个字母,所以我链接到的代码使用$key["Name"][0] 访问$key["Name"] 的第一个字母
  • 但如果我使用 [0],那将是硬编码的。我正在尝试以一种无需硬编码就能做到的方式学习。
  • 只需将您的 if 语句更改为 if(preg_match("/^{$name}/i", $key["Name"])) 就可以了!

标签: php arrays loops


【解决方案1】:

获取$key['Name']的第一个字符,然后将其与变量$name进行比较。如果匹配,则将$key['Hours'] 添加到变量中。继续对 arrayChart 中的每个项目执行此操作。

$name = "M";
$hours = 0;

foreach($arrayChart as $key){
    if ($key['Name'][0] === $name) {
        $hours += $key["Hours"];
    }   
}
print_r($hours);

示例:https://rextester.com/VFPH10481

也可以看看这个问题:Getting the first character of a string with $str[0]

编辑

如果$name = "Mike" 是必需的,您可以这样做:

$name = 'M';
$hours = 0;

foreach($arrayChart as $key){
    
    $foundAtPosition = strpos($key['Name'], $name);
    if ($foundAtPosition === false ||
        $foundAtPosition > 0) {
        continue;
    }
    
    $hours += $key["Hours"];
}
print_r($hours);

例如:https://rextester.com/ZHCG76001

说明:查看strpos函数的手册。使用该功能,您可以在您的$key['Name'] 中找到$name 所在的位置。如果没有找到,strpos 将导致 false。如果找到了,strpos 会告诉你在哪里找到的。

如果$name 出现在开头,strpos 将显示0。使用该逻辑,如果 strpos 的结果为 false 或大于 0,您可以要求循环跳过。否则,您可以计算小时数。

如果您想要不区分大小写的搜索,请改用stripos 函数。

编辑 2

如果您想提取 ID 和小时数,您可以这样做:

$name = 'M';
$hours = 0;
$ids = array();

foreach($arrayChart as $key){

    $foundAtPosition = strpos($key['Name'], $name);
    if ($foundAtPosition === false ||
        $foundAtPosition > 0) {
        continue;
    }   

    $hours += $key["Hours"];
    $ids[] = $key['ID'];
}
echo $hours . "\n";
echo join(',', $ids) . "\n";

示例:https://rextester.com/ZRIC46050

解释:我们创建一个名为$ids 的空数组变量。当我们找到匹配项时,我们将 Mike 或 M(或任何您匹配的对象)的 ID 添加到数组中。 $ids[] = 'something' 表示在 $ids 变量的末尾添加 something。要将该变量打印为逗号分隔值,请使用 join 函数,该函数在上述代码中使用逗号连接数组的每个项目。

【讨论】:

  • 如果是全名而不是第一个字母怎么办。就像拥有 Mike G 和 Mike L。我认为这行不通,因为它看起来是硬编码的。
  • @Joe 你的意思是$name 可能是Mike G
  • 我得到的是“Mike”而不是“M”,然后从名字而不是第一个字母中获取小时的值。这样上面的方法就不行了。
  • 您应该在问题中添加这些类型的要求。如果给您命名 $name = "Mike" 并且数组有 2 个名称 - Mike AndersonMike Johnson,您要寻找的输出是什么?
  • @Joe 在 StackOverflow 上打开一个新问题,其中包含您需要的详细信息,有人可以回答。在您的问题中添加示例输入和示例输出。如果某些东西不起作用,请展示你得到的输出。使用 rextester 或其他网站放置您的代码,保存代码以生成链接(如果使用 rextester.com)并在您的问题中分享。有了这些细节,你会得到一些很好的答案。
猜你喜欢
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 2013-08-30
相关资源
最近更新 更多