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..

my$aの長さは 20 を超えており、さらに増加する可能性があるため、関数を手動で記述するのではなく、一般的な方法が必要です

フィルタリングされたすべての配列を生成する関数 array_split が存在しないようです
。さもなければ、一種のラムダ関数が必要かもしれません

4

3 に答える 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');

私の2番目の例では、配列を渡して、どの値に基づいて何をフィルタリングするか(たとえば、色やその他の将来のプロパティ)を関数に指示することができます。

プロパティが実際に存在するかどうかのチェックでエラーが発生していないことに注意してください

于 2012-08-30T21:00:10.127 に答える
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>';
于 2012-08-30T20:59:45.213 に答える
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));
于 2015-03-22T23:22:05.390 に答える