1

次のような配列があります。

Array(
[0] => Array([city] => 309[store] => 12[apples] => 21[oranges] => 14[lichis] => 34)
[1] => Array([city] => 309[店] => 13[りんご] => 0[みかん] => 11[ライチ] => 32)
[2] => Array([都市] => 309[店] => 14[りんご] => 44[オレンジ] => 61[リチ] => 0)
[3] => Array([都市] => 309[店舗] => 15[リンゴ] => 7[オレンジ] => 0[リチ] => 6)
[4] => Array([都市] => 309[店舗] => 16[リンゴ] => 0[オレンジ] => 0[ライチ] => 12) )

ここで私がしなければならないことは 2 つあり
ます。1. 都市にあるすべての特定の果物の数を取得する (つまり、都市 309 にあるリンゴ、オレンジ、ライチの合計数)、および
2. の値を取得する方法特定の店?

前もって感謝します!

4

4 に答える 4

2

わかりました、配列が $store と呼ばれているとしましょう

$count = 0;
$s = array();

foreach($store as $store){
 $count = 0;
 $count += $store['apples'];
 $count += $store['oranges'];

 $s[$store['store']] = $count;
}

必要に応じて果物を追加します。

于 2013-01-08T14:48:30.290 に答える
0

これはより複雑な例ですが、スパゲッティ コードよりは優れています。最初に配列を XML に変換します。

// this is your initial array
$my_array = array(
array("city"=>309, "store"=>12, "apples"=>21, "oranges"=>14, "lichis"=>34 ),
array("city"=>309, "store"=>13, "apples"=>0, "oranges"=>11, "lichis"=>32 ),
array("city"=>309, "store"=>14, "apples"=>44, "oranges"=>61, "lichis"=>0 ),
array("city"=>309, "store"=>15, "apples"=>7, "oranges"=>0, "lichis"=>6 ),
array("city"=>309, "store"=>16, "apples"=>0, "oranges"=>0, "lichis"=>12 ),
);

ストアを手動で分離するためのスパゲッティ コードを記述すると、if ステートメントとループの厄介なジャングルになります。

// might as well convert it to xml
function array_to_xml( $data ) {
    $xml = "<xml>\n";
    foreach( $data as $row ) {
        $xml .= "<entry>";
        foreach( $row as $k => $v ) {
            $xml .= "<{$k}>{$v}</{$k}>";
        }
        $xml .= "</entry>\n";
    }
    $xml .= "</xml>\n";
    return( $xml );
}

この時点で、$xml(文字列として) 次のようになり、より管理しやすくなります。

<xml>
  <entry>
    <city>309</city>
    <store>12</store>
    <apples>21</apples>
    <oranges>14</oranges>
    <lichis>34</lichis>
  </entry>
  ...(more entries)...
</xml>

次に、XML 標準である XPath でクエリ可能なものにロードします。

$xml = simplexml_load_string( array_to_xml( $my_array ) );

市内のすべての特定の果物の数 (つまり、市 309 にあるリンゴ、オレンジ、ライチの合計数) を取得するには、単純ですが再利用可能な集計関数が必要です。

// so lets make a generic function to count specific items
function count_items( $stores, $items = array() ) {
    $sum = array();
    foreach( $stores as $store ) {
        foreach( $items as $k ) {
            if( !isset( $sum[$k] ) ) $sum[$k] = 0;
            $sum[$k] += $store->$k;
        }
    }
    return( $sum );
}

都市 309 のみが必要であり、特にリンゴ、オレンジ、およびライチを探します。これらは果物であるためです。

$only_this_city = $xml->xpath("//entry[city=309]");
print_r( count_items( $only_this_city, array("apples", "oranges", "lichis")) );

これを取得します:

Array
(
    [apples] => 72
    [oranges] => 86
    [lichis] => 84
)

次に、特定のストアの値を取得するには:

$only_this_store = $xml->xpath("//entry[city=309 and store=14]");
print_r( count_items( $only_this_store, array("apples") ) );

あなたは得る:

Array
(
    [apples] => 44
)

明らかに、より多くのアイテムをリクエストしたり、より複雑なクエリを実行したりできます。今後のクエリについては、XPath に関するドキュメントを参照してください。

于 2013-01-08T15:02:54.283 に答える
0

注:反応の前に… OP がオブジェクト指向の方法でこれを処理する方法を尋ねていないことはわかっているので、これは単なる提案です。

全体のデータ用に別のクラスを作成し、店舗データごとに別のクラスを作成します。

$arr = array(
    array('city' => 309, 'store' => 12, 'apples' => 21, 'oranges' => 14, 'lichis' => 34),
    array('city' => 309, 'store' => 13, 'apples' => 0, 'oranges' => 11, 'lichis' => 32),
    array('city' => 309, 'store' => 14, 'apples' => 44, 'oranges' => 61, 'lichis' => 0),
    array('city' => 309, 'store' => 15, 'apples' => 7, 'oranges' => 0, 'lichis' => 6),
    array('city' => 309, 'store' => 16, 'apples' => 0, 'oranges' => 0, 'lichis' => 12)
);

foreach ($arr as $rec) {
    $storeID = $rec['store'];
    $city = $rec['city'];
    unset($rec['city'],$rec['store']);
    // assuming all the keys except these 2
    // represent product name->quantity pairs
    StoreData::add(new Store($storeID,$city,$rec));
}
//print_r(StoreData::$stores);

echo
'<b>total products:</b> ' .
    StoreData::get_total_products() . PHP_EOL .
'<b>total products in city #309:</b> ' .
    StoreData::get_total_products_by_city(309) . PHP_EOL .
'<b>"apples" everywhere:</b> ' .
    StoreData::get_product_total('apples') . PHP_EOL .
'<b>"apples" in store #12:</b> ' .
    StoreData::get_product_total_by_store('apples',12) . PHP_EOL .
'<b>"apples" in city #309:</b> ' .
    StoreData::get_product_total_by_city('apples',309);


class StoreData {

    public static $stores = array();

    public static function add(Store $store) {
        self::$stores[] = $store;
    }

    public static function remove(Store $store) {
        foreach (self::$stores as $key => $value) {
            if ($value == $store) {
                unset(self::$stores[$key]);
                break;
            }
        }
    }

    public static function find_by_city($cityID) {
        $cityID = (int) $cityID;
        return array_filter(self::$stores,create_function(
            '$store',
            "return \$store->city == $cityID;")
        );
    }

    public static function find_by_store($storeID) {
        $storeID = (int) $storeID;
        foreach (self::$stores as $store) {
            if ($store->id == $storeID) return $store;
        }
        return FALSE;
    }

    public static function get_total_products() {
        $total = 0;
        foreach (self::$stores as $store)
            $total += $store->get_total_products();
        return $total;
    }

    public static function get_total_products_by_city($city) {
        $stores = self::find_by_city((int) $city);
        $total = 0;
        foreach ($stores as $store)
            $total += $store->get_total_products();
        return $total;
    }

    public static function get_product_total_by_city($productName,$city) {
        return self::product_total($productName,self::find_by_city((int) $city));
    }

    public static function get_product_total_by_store($productName,$storeID) {
        $res = self::find_by_store((int) $storeID);
        return $res ? self::product_total($productName,array($res)) : $res;
    }

    public static function get_product_total($productName) {
        return self::product_total($productName,self::$stores);
    }

    private static function product_total($productName,$stores=NULL) {
        $total = 0;
        foreach ($stores as $store)
            $total += $store->get_product_total($productName);
        return $total;
    }

}

class Store {

    public $id;
    public $city;
    public $products;

    function __construct($id,$city,$products=array()) {
        $this->id = $id;
        $this->city = $city;
        $this->products = $products;
    }

    public function get_total_products() {
        return array_sum($this->products);
    }

    public function get_product_total($productName) {
        if (isset($this->products[$productName]))
            return (int) $this->products[$productName];
        return 0;
    }

}

出力します

商品の総数: 242
都市 #309 の商品の総数: 242個の
「りんご」 どこでも: 72
個の「りんご」が店 #12 にある: 21個
の「りんご」が市 #309 にある: 72

于 2013-01-08T20:37:32.740 に答える
0
function extractData( array $data, $store = null )
{
    $callback = function( $values, $array ) use ( $store )
    {
        // We require values for a particular store
        if( ! is_null( $store ) )
        {
            if( $array[ 'store' ] == $store )
            {
                return $array;
            }

            return false;
        }
        // Return the sum of all stores in a city
        else
        {
            // Toss out the city and store values since they're not needed
            unset( $array['city'], $array['store'] );

            // Seed the initial values
            if( ! is_array( $values ) || empty( $values ) )
            {
                return $array;
            }

            // array_map function used add the arrays
            $add = function( $a, $b )
            {
                return $a + $b;
            };

            // Add the arrays
            $summedArray = array_map( $add, $values, $array );

            // Return the combined array structure
            return array_combine( array_keys( $values ), $summedArray );
        }
    };

    return array_reduce( $data, $callback, array() );
}

$data = array(
    0 => array(
        "city" => 309,
        "store" => 12,
        "apples" => 21,
        "oranges" => 14,
        "lichis" => 34
    ),
    1 => array(
        "city" => 309,
        "store" => 13,
        "apples" => 0,
        "oranges" => 11,
        "lichis" => 32
    ),
    2 => array(
        "city" => 309,
        "store" => 14,
        "apples" => 44,
        "oranges" => 61,
        "lichis" => 0
    ),
    3 => array(
        "city" => 309,
        "store" => 15,
        "apples" => 7,
        "oranges" => 0,
        "lichis" => 6
    ),
    4 => array(
        "city" => 309,
        "store" => 16,
        "apples" => 0,
        "oranges" => 0,
        "lichis" => 12
    )
);

// Return the values for a particular store
print_r( extractData( $data, 16 ) );

// Return the total of all stores in the city
print_r( extractData( $data ) );

これにより、次の結果が得られます...

単一都市

Array
(
    [city] => 309
    [store] => 16
    [apples] => 0
    [oranges] => 0
    [lichis] => 12
)

合計

Array
(
    [apples] => 72
    [oranges] => 86
    [lichis] => 84
)
于 2013-01-08T16:46:58.127 に答える