从第二级数组值返回第一级键,而不循环遍历数组[重复]

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

我有以下数组:

$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 发现此键 3 与 2023-01-15 匹配,total_mov 为 3000

查找 2023-02-15 发现此键 2 与 2023-02-15 匹配,total_mov 为 3000

查找 2023-03-15 发现此键 1 与 2023-03-15 匹配,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,没有找到

php arrays multidimensional-array
1个回答
1
投票

我认为你应该修复这部分

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
函数返回与搜索值匹配的第一个元素的键,所以它总是返回一个值,即使在数组中找不到该值。

© www.soinside.com 2019 - 2024. All rights reserved.