将一个数组拆分成子数组

4
我想要分割一个数组:
$o = json_decode('[{"id":"1","color":"green"},{"id":"2","color":"green"},{"id":"3","color":"yellow"},{"id":"4","color":"green"}]');

根据每个项目的颜色属性,填充相应的子数组。
$a = array("green", "yellow", "blue");

function isGreen($var){
    return($var->color == "green");
}

$greens = array_filter($o, "isGreen");
$yellows = array_filter($o, "isYellow");
// and all possible categories in $a..

我的$a长度大于20,而且可能会增加,因此我需要一种通用的方法,而不是手动编写函数。
似乎不存在一个名为array_split的函数来生成所有过滤后的数组,或者我需要一种类似于lambda函数的东西。

所以,您想要为$a中的每个值编写一个函数?还是我理解有误? - gen_Eric
抱歉,循环有什么问题吗?在这里生成匿名函数似乎是一种过度复杂化的做法... - DaveRandom
2
一个 isColour() ... 函数不是更聪明吗? - user557846
你想获取所有颜色为绿色的物品吗? - uınbɐɥs
是的,即使他们都拼错了“colour”这个单词;-) - user557846
显示剩余2条评论
3个回答

6
你可以这样做:

您可以像这样做:

$o = json_decode('[{"id":"1","color":"green"},{"id":"2","color":"green"},{"id":"3","color":"yellow"},{"id":"4","color":"green"}]');

$greens = array_filter($o, function($item) {
    if ($item->color == 'green') {
        return true;
    }

    return false;
});

或者,如果你想创建一些真正通用的东西,可以尝试以下方法:

function filterArray($array, $type, $value)
{
    $result = array();
    foreach($array as $item) {
        if ($item->{$type} == $value) {
            $result[] = $item;
        }
    }

    return $result;
}

$o = json_decode('[{"id":"1","color":"green"},{"id":"2","color":"green"},{"id":"3","color":"yellow"},{"id":"4","color":"green"}]');
$greens = filterArray($o, 'color', 'green');
$yellows = filterArray($o, 'color', 'yellow');

在我的第二个例子中,你可以只传递数组,并告诉函数基于哪个值进行筛选(例如颜色或其他未来属性)。请注意,我没有进行任何错误检查以确定属性是否真的存在。

1

我不会走创建大量函数的路,无论是手动还是动态地。

这是我的想法,设计可以进行修改以使过滤器可链接:

<?php
class ItemsFilter
{
    protected $items = array();

    public function __construct($items) {
        $this->items = $items;
    }

    public function byColor($color)
    {
        $items = array();

        foreach ($this->items as $item) {
            // I don't like this: I would prefer each item was an object and had getColor()
            if (empty($item->color) || $item->color != $color)
                continue;

            $items[] = $item;
        }

        return $items;
    }
}

$items = json_decode('[{"id":"1","color":"green"},{"id":"2","color":"green"},{"id":"3","color":"yellow"},{"id":"4","color":"green"}]');
$filter = new ItemsFilter($items);
$greens = $filter->byColor('green');

echo '<pre>';
print_r($greens);
echo '</pre>';

创建新类比创建“大量”函数更好的原因是什么? - robbrit
函数确实在全局命名空间中。这个说法没有任何问题 :) - PeeHaa
1
类也在全局命名空间中。唯一的区别似乎是完成一个简单任务所需要的复杂程度。 - robbrit

0
如果您需要更多的参数,您可以使用这个函数:
function splitArray($array, $params) {
    $result = array();

    foreach ($array as $item) {

        $status = true;

        foreach ($params as $key => $value) {
            if ($item[$key] != $value) {
                $status = false;
                continue;
            }
        }

        if ($status == true) {
            $result[] = $item;
        }
    }

    return $result;
}

$greensAndID1 = splitArray($o, array('color' => 'green', 'id' => 1));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接