如何从php数组中选择特定记录

时间:2016-02-07 09:48:33

标签: php

我有一个多维数组:

$array=array(
[0]=>array([0]=>"100",
           [1]=>"snd",
           [2]=>array(['id']="1",['name']=>"xperia")

),
[1]=>array([0]=>"100",
           [1]=>"snd",
           [2]=>array(['id']="2",['name']=>"xperia")
),

[2]=>array([0]=>"100",
           [1]=>"fkt",
           [2]=>array(['id']="3",['name']=>"xperia")
),
[3]=>array([0]=>"100",
           [1]=>"fkt",
           [2]=>array(['id']="4",['name']=>"xperia")
),
[4]=>array([0]=>"90",
           [1]=>"snd",
           [2]=>array(['id']="5",['name']=>"xperia")
),
[5]=>array([0]=>"90",
           [1]=>"fkt",
           [2]=>array(['id']="6",['name']=>"xperia")
)
);

数组包含的示例:

$array[0][0]=percentage
$array[0][1]=merchant
$array[0][2]=product info

我希望显示任何一个百分比介于80-100之间的商家。 即使两个商家100%匹配仍然我想要显示一次。

我使用了以下逻辑和代码:

foreach($array as $final_array)
{
if($final_array[0]>=90)
{
echo $final_array[0];
echo $final_array[2]['id'];
echo $final_array[2]['name'];
}
}

如何避免显示双倍的相同商家信息?我也尝试过array_unique函数,但它只向我展示了第一个产品。

4 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。我想它需要像那样:

foreach ($array as $final_array)
{
    if ($final_array[0]>=80) {
        echo $final_array[0];
        echo $final_array[2][0];
        echo $final_array[2][1];
    }
}

如果您需要避免重复这样的事情:

$merchants = array();
foreach ($array as $final_array)
{
    $merchant = $final_array[1];
    if ( ($final_array[0]>=80) && !in_array($merchant, $merchants) ) {
        $merchants[] = $merchant;
        echo $final_array[0];
        echo $final_array[2][0];
        echo $final_array[2][1];
    }
}

答案 1 :(得分:0)

过滤数组最简单,最优雅的是使用php的数组函数与回调相结合的强大功能:

<?php

$input = [
    ["100%", "snd", ['id' =>1, 'name'=>"xperia"]],
    ["100%", "snd", ['id' =>2, 'name'=>"xperia"]],
    [ "90%", "fkt", ['id' =>3, 'name'=>"xperia"]],
    [ "80%", "fkt", ['id' =>4, 'name'=>"xperia"]],
    [ "70%", "snd", ['id' =>5, 'name'=>"xperia"]],
    [ "60%", "fkt", ['id' =>6, 'name'=>"xperia"]],
];

print_r(array_filter($input, function($val){
    return ((int)$val[0] >= 80);
}));

注意:我修改了输入值以演示过滤器应用程序。

但正如上面评论中所述:将数字90与字符串“90%”进行比较是一件非常危险的事情($ array [0]&gt; = 90)。您将数字与字符串进行比较,并盲目相信自动转换将“90%”变为90.也许您想在此处投资一些正则表达式数字提取,除非您100%确定那些字符串总是具有那种格式......

答案 2 :(得分:0)

您可以创建另一个数组来存储显示的商家名称,并检查是否显示了当前商家:

$shownMerchants = array();

foreach($array as $final_array)
{
    if($final_array[0]>=80 && !in_array($final_array[1], $shownMerchants))
    {
        echo $final_array[0];
        echo $final_array[2][0];
        echo $final_array[2][1];
        $shownMerchants[] = $final_array[1];
    }
}

另外,正如@arkascha所说,最好将百分比存储为整数。

答案 3 :(得分:0)

$arrayInput =array(
    0=>array(0=>"100",
               1=>"snd",
               2=>array('id'=>"1",'name'=>"xperia")

    ),
    1=>array(0=>"100",
               1=>"snd",
               2=>array('id'=>"2",'name'=>"xperia")
    ),

    2=>array(0=>"100",
               1=>"fkt",
               2=>array('id'=>"3",'name'=>"xperia")
    ),
    3=>array(0=>"100",
               1=>"fkt",
              2=>array('id'=>"4",'name'=>"xperia")
    ),
    4=>array(0=>"90",
               1=>"snd",
               2=>array('id'=>"5",'name'=>"xperia")
    ),
    5=>array(0=>"90",
               1=>"fkt",
               2=>array('id'=>"6",'name'=>"xperia")
    )
);  

$Merchants = array();

foreach($arrayInput as $key => $val)
{
    $m_name = array_map(function ($ar) {return $ar[1].'-'.$ar[0];}, $Merchants); ///get all the merchant name and percentage from $Merchants new array

    if($val[0] >= 80  && !in_array($val[1].'-'.$val[0],$m_name)) /// if % greater than 80 and same merchant with same % not exists than push into array
    {
        $Merchants[] = $val;
    }
}
echo "<pre>"; print_r($Merchants);

这会给你:

Array
(
    [0] => Array
        (
            [0] => 100
            [1] => snd
            [2] => Array
                (
                    [id] => 1
                    [name] => xperia
                )

        )

    [1] => Array
        (
            [0] => 100
            [1] => fkt
            [2] => Array
                (
                    [id] => 3
                    [name] => xperia
                )

        )

    [2] => Array
        (
            [0] => 90
            [1] => snd
            [2] => Array
                (
                    [id] => 5
                    [name] => xperia
                )

        )

    [3] => Array
        (
            [0] => 90
            [1] => fkt
            [2] => Array
                (
                    [id] => 6
                    [name] => xperia
                )

        )

)

现场示例:CLICK HERE