如何在多维数组中找到具有特定值的值?

时间:2019-08-24 01:23:46

标签: php multidimensional-array

我有一个看起来像这样的数组:

Array
(
    [2019] => Array
        (
            [2019] => Array
                (
                    [year] => 2019
                    [amount] => 3269.93
                    [type] => charge
                )

        )

    [2018] => Array
        (
            [2018] => Array
                (
                    [year] => 2018
                    [amount] => 219.25
                    [type] => payout
                )

        )

    [2017] => Array
        (
            [2017] => Array
                (
                    [year] => 2017
                    [amount] => 214.06
                    [type] => charge
                )

        )

)

我尝试过array_search(),但我认为它无法实现我想要的功能。

根据手册,array_search()用于在数组中搜索特定值,如果找到该值,则它将返回其对应的键。这考虑到我们知道我们要寻找的值是什么,并且我们想返回密钥。我想反过来做。我知道键,但是我不知道值,我想返回值而不是键。

我正在尝试执行类似于MYSQL "select amount where year='2017'"的操作,但是要使用数组。

我该如何完成?有想法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用array_filter

过滤数组
array_filter($array,function ($v){
    return current($v)["amount"] == 3269.93;
});

答案 1 :(得分:0)

我使用嵌套的foreach解决了我的问题。我敢肯定有更聪明的方法可以达到最终结果,但对我有用。

数组

function lonlat2xy(lonUsrD, latUsrD) { //user input position in lon a lat in degrees
    var oneRadOfDegree = 57.29577951308232; //  for conversion of degrees to rads
    var latPragR = 50.008 / oneRadOfDegree; //lat. of base station, default position in rads
    var lonPragR = 14.447 / oneRadOfDegree; //lon. of base station, default position in rads
    var leftPragPx = 301.5;                 // length from left side of image to base station in px
    var topPragPx = 217.5;                  // length from top side of image to base station in px
    var ratioMap = 1.0;                     //ratio of the map (always 1 for thos example)
    var radiusEarth = 6378.144;         //radius of Earth
    var pi1 = 3.141592653589793;    //pi
    var pi2 = 6.283185307179586;    //2pi
    var pi05 = 1.570796326794897;   //0.5pi
    var lonUsrRNeg = -1 * (lonUsrD / oneRadOfDegree); //inversed user lon. position in rads
    var latUsrR = latUsrD / oneRadOfDegree;              //user lat. position in rads
    var lonPragRNeg = -1 * lonPragR;                     //inversed base station lon. position in rads
    var latPragR1 = latPragR;                            //base station lat. position in rads

    //?????? No idea what this formula does
    var un25 = (Math[sin](latUsrR) * Math[sin](latPragR1)) + (Math[cos](latUsrR) * Math[cos](latPragR1) * Math[cos](lonUsrRNeg - lonPragRNeg));
    sin()
    //??????

    var un26 = Math[acos](un25);

    un25 = Math[sin](latUsrR) - (Math[sin](latPragR1) * un25);
    var un27 = (Math[cos](latPragR1) * Math[sin](un26));


    if (un27 != 0) {
        un25 = un25 / un27;
    } else {
        un25 = 0;
    }

    var un28 = Math[acos](un25); 
    var lonDiffPragUsr = lonUsrRNeg - lonPragRNeg;
    if ((lonUsrRNeg > lonPragRNeg) && (lonDiffPragUsr < pi1)) {
        un28 = pi2 - un28; 
    }

    var un2a = un26;
    var un2b = un28; 
    var xPxImg, yPxImg, un2e;
    if (un2a < pi05) {
        un2e = Math[tan](un2a);
        xPxImg = un2e * Math[sin](un2b); 
        yPxImg = un2e * Math[cos](un2b);
    } else {
        xPxImg = 0;
        yPxImg = 0;
    }
    //[xy]PxImg - wrong name - I dont know what exactly this var represent
    xPxImg = leftPragPx + (xPxImg * radiusEarth) / ratioMap; //IMG-x = (IMGx prazske stanice)  + ((2PI*(pixN/pix360)) * polomer zeme)/ 1 ... ratio
    yPxImg = topPragPx - ((yPxImg * radiusEarth) / ratioMap);


    //Clear part from here
    var xPxImgRo = Math[round](xPxImg); //Round IMG-x
    var yPxImgRo = Math[round](yPxImg); //Round IMG-y

    out_xy = new Array(2);  //create array for rturn
    out_xy[0] = xPxImgRo;
    out_xy[1] = yPxImgRo;

    return out_xy; 
}

每个的最终结果

$data_array='Array
(
    [2019] => Array
        (
            [2019] => Array
                (
                    [year] => 2019
                    [amount] => 3269.93
                    [type] => charge
                )

        )

    [2018] => Array
        (
            [2018] => Array
                (
                    [year] => 2018
                    [amount] => 219.25
                    [type] => payout
                )

        )

    [2017] => Array
        (
            [2017] => Array
                (
                    [year] => 2017
                    [amount] => 214.06
                    [type] => charge
                )

        )

)';