php 从第二级数组值返回第一级关键字,而不循环遍历数组

vbkedwbf  于 2023-01-16  发布在  PHP
关注(0)|答案(1)|浏览(136)

我有以下数组:

$entrate=Array
(
    0 => Array(
            'id' => 1,
            'nome' => 'Stipendio',
            'datamov' => '2023-04-15',
            'mese' => 4,
            'anno' => 2023,
            'total_mov' => 3000.00
        ),

    1 => Array(
            'id' => 1,
            'nome' => 'Stipendio',
            'datamov' => '2023-03-15',
            'mese' => 3,
            'anno' => 2023,
            'total_mov' => 3000.00
        ),

    2 => Array(
            'id' => 1,
            'nome' => 'Stipendio',
            'datamov' => '2023-02-15',
            'mese' => 2,
            'anno' => 2023,
            'total_mov' => 3000.00
        ),

    3 => Array(
            'id' => 1,
            'nome' => 'Stipendio',
            'datamov' => '2023-01-15',
            'mese' => 1,
            'anno' => 2023,
            'total_mov' => 3000.00
        )
);

我想通过返回第一级数组的键的datamov值来搜索,所以在查找'2023 - 03 - 15'时,我想返回1作为结果。
我试着这样做:

$anno_start='2023';
$mese_start='01';
$end='2023-12-31';
$datemovs=array_column($entrata, 'datamov');
while (strtotime($anno_start . '-' . $mese_start . '-01') < strtotime($end)) {
    $mese_start_num = ltrim($mese_start, '0');
    $searched_date=$anno_start.'-'.$mese_start.'-15';
    echo 'looking for '.$searched_date;
    if($found_key = array_search($searched_date, $datemovs)!==NULL){
    echo ' found this key '.$found_key;
        $datatrovata = $entrata[$found_key]['datamov'];
        echo " that matches $datatrovata \n";
    }else{
        echo " and I found nothing";

    }
    $mese_start_num = $mese_start_num + 1;
    if ($mese_start_num > 12) {
        $anno_start = $anno_start + 1;
        $mese_start_num = 1;
        $mese_start='01';
    }
    if($mese_start_num<10){$mese_start='0'.$mese_start_num;}else{$mese_start=$mese_start_num;}
}

但它给了我
查找2023 - 01 - 15找到了与2023 - 03 - 15匹配的密钥1
查找2023 - 02 - 15找到了与2023 - 03 - 15匹配的密钥1
查找2023 - 03 - 15找到了与2023 - 03 - 15匹配的密钥1
查找2023 - 04 - 15找到了与2023 - 03 - 15匹配的密钥1
查找2023 - 05 - 15找到了与2023 - 03 - 15匹配的密钥1
查找2023 - 06 - 15找到了与2023 - 03 - 15匹配的密钥1
查找2023 - 07 - 15找到了与2023 - 03 - 15匹配的密钥1
查找2023 - 08 - 15找到了与2023 - 03 - 15匹配的密钥1
查找2023 - 09 - 15找到了与2023 - 03 - 15匹配的密钥1
查找2023 - 10 - 15找到了与2023 - 03 - 15匹配的密钥1
查找2023 - 11 - 15找到了与2023 - 03 - 15匹配的密钥1
查找2023 - 12 - 15找到了与2023 - 03 - 15匹配的密钥1
这显然是错的,我错过了什么
我的目标是
查找2023 - 01 - 15时,找到了与2023 - 01 - 15匹配的密钥3,total_mov为3000
查找2023 - 02 - 15时,找到了与2023 - 02 - 15匹配的密钥2,total_mov为3000
查找2023 - 03 - 15时,找到了与2023 - 03 - 15匹配的密钥1,total_mov为3000
查找2023 - 04 - 15时发现此键0与2023 - 04 - 15匹配,total_mov为3000
查找2023 - 05 - 15,未找到任何内容
查找2023 - 06 - 15,未找到任何内容
查找2023 - 07 - 15,未找到任何内容
查找2023 - 08 - 15,未找到任何内容
查找2023 - 09 - 15,未找到任何内容
查找2023 - 10 - 15,但未找到任何内容
查找2023 - 11 - 15,未找到任何内容
查找2023 - 12 - 15,未找到任何内容

tzdcorbm

tzdcorbm1#

我认为你应该修理这部分

if($found_key = array_search($searched_date, $datemovs)!==NULL){

发送至

$found_key = array_search($searched_date, $datemovs);
if($found_key !== false){

下面是完整的部分:

while (strtotime($anno_start . '-' . $mese_start . '-01') < strtotime($end)) {
    $mese_start_num = ltrim($mese_start, '0');
    $searched_date=$anno_start.'-'.$mese_start.'-15';
    $found_key = array_search($searched_date, $datemovs);
    if($found_key !== false){ // <-- THIS ROW
        echo ' found this key '.$found_key;
        $datatrovata = $entrata[$found_key]['datamov'];
        echo " that matches $datatrovata \n";
    }else{
        echo " and I found nothing";
    }
    $mese_start_num = $mese_start_num + 1;
    if ($mese_start_num > 12) {
        $anno_start = $anno_start + 1;
        $mese_start_num = 1;
        $mese_start='01';
    }
    if($mese_start_num<10){$mese_start='0'.$mese_start_num;}else{$mese_start=$mese_start_num;}
}

因为array_search函数返回与搜索值匹配的第一个元素的键,所以它总是返回一个值,即使在数组中找不到该值。

相关问题