PHP - 根据值创建多个数组

时间:2017-03-21 14:10:08

标签: php arrays

我有一个这样的数组:

$r = array();
$r[] = ['name' => 'Test', 'supplierId' => 34];
$r[] = ['name' => 'Test2', 'supplierId' => 31];
$r[] = ['name' => 'Test3', 'supplierId' => 32];
$r[] = ['name' => 'Test4', 'supplierId' => 34];
$r[] = ['name' => 'Test5', 'supplierId' => 30];
$r[] = ['name' => 'Test6', 'supplierId' => 32];

现在我想拿$ r并获得多个数组,由supplierId区别。所以我正在寻找这个结果:

    $r30 = ['name' => 'Test5', 'supplierId' => 30];
    $r32 = [
    ['name' => 'Test3', 'supplierId' => 32],
    ['name' => 'Test6', 'supplierId' => 32]
    ];

我尝试过,但在这里我无法访问array_filter中的$ sup。

$supplier = array(30, 31, 32, 34);
$finalArray = [];

foreach ($supplier as $sup) {
    $finalArray[] = array_filter($r, function($value, $sup) {
        echo $sup;
        if ($value['supplierId'] == $sup) {
            return true;
        }
    });
}//foreach

知道如何解决它吗?是否没有完成此功能的本机功能 - 类似于create_array_based_on('supplierId');

由于

5 个答案:

答案 0 :(得分:2)

您可以将$sup传递给您的匿名函数:

foreach ($supplier as $sup) {
    $finalArray[] = array_filter($r, function($value) use ($sup) {
                                                      ^^^^^^^^^^ you need to pass
                                                                 it like this
        echo $sup;
        if ($value['supplierId'] == $sup) {
            return true;
        }
    });
}//foreach

但我个人可能只是遍历原始数组并使用供应商ID作为密钥。

类似的东西:

$results = [];
foreach ($r as $value) {
    $results[$value['supplierId']][] = $value;
}

答案 1 :(得分:1)

试试这个

$r = array();
$r[] = ['name' => 'Test', 'supplierId' => 34];
$r[] = ['name' => 'Test2', 'supplierId' => 31];
$r[] = ['name' => 'Test3', 'supplierId' => 32];
$r[] = ['name' => 'Test4', 'supplierId' => 34];
$r[] = ['name' => 'Test5', 'supplierId' => 30];
$r[] = ['name' => 'Test6', 'supplierId' => 32];

$supplier = array(30, 31, 32, 34);
$finalArray = [];


$i=0;
foreach ($supplier as $sup) {
    $value =$r[$i]['supplierId'];
    if($value==$sup)
    {
        $finalArray[] = $value;
    }

 $i++;

}//foreach

$ finalArray是一个包含您需要的所有值的新数组

答案 2 :(得分:0)

您可以合并array_filterin_array,如下所示:

$finalArray[] = array_filter($r, function($value) use ($supplier) {
    return in_array($value['supplierId'], $supplier);
});

没有foreach循环。

答案 3 :(得分:0)

它会更容易,而不是每个都想要新的变量,比如$ r32,$ r35等......如果你只是使用数组键存储supplierid,例如

$r = array();
$r[] = ['name' => 'Test', 'supplierId' => 34];
$r[] = ['name' => 'Test2', 'supplierId' => 31];
$r[] = ['name' => 'Test3', 'supplierId' => 32];
$r[] = ['name' => 'Test4', 'supplierId' => 34];
$r[] = ['name' => 'Test5', 'supplierId' => 30];
$r[] = ['name' => 'Test6', 'supplierId' => 32];

$newArray = array();

foreach($r as $key => $element)
{
    if (!isset($newArray[$element['supplierId']])){
        $newArray[$element['supplierId']] = array();
    }
    $newArray[$element['supplierId']][] = $element;
}

这会给你输出:

<pre>Array
(
    [34] => Array
        (
            [0] => Array
                (
                    [name] => Test
                    [supplierId] => 34
                )

            [1] => Array
                (
                    [name] => Test4
                    [supplierId] => 34
                )

        )

    [31] => Array
        (
            [0] => Array
                (
                    [name] => Test2
                    [supplierId] => 31
                )

        )

    [32] => Array
        (
            [0] => Array
                (
                    [name] => Test3
                    [supplierId] => 32
                )

            [1] => Array
                (
                    [name] => Test6
                    [supplierId] => 32
                )

        )

    [30] => Array
        (
            [0] => Array
                (
                    [name] => Test5
                    [supplierId] => 30
                )

        )

)
</pre>

答案 4 :(得分:0)

关于通过某个键值对嵌套数组进行简单分组:

$finalArr = [];
foreach ($r as $arr) {
    $finalArr[$arr['supplierId']][] = $arr;
}

print_r($finalArr);

DEMO link

相关问题