Обновите одно значение ключа в коллекции Laravel Illuminate - PullRequest
0 голосов
/ 27 сентября 2018

Я создаю коллекцию из ответа API Facebook.

$ads = new \Illuminate\Support\Collection;

if (!$ads->has($insight[$key])) {
    $ads->put($insight[$key], [
        'ad_id'                             => $insight[AdsInsightsFields::AD_ID],
        'ad_name'                           => $insight[AdsInsightsFields::AD_NAME],
        'ctr'                               => (float)$insight[AdsInsightsFields::CTR],
        'spend'                             => (float)$insight[AdsInsightsFields::SPEND],
    ]);
} else {
    // Increment spend value here.
}

Если бы это был массив, я бы просто сделал это:

$ads[$insight[$key]]['spend'] += $insight[AdsInsightsFields::SPEND];

Как мне это сделатьна коллекцию?

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Во-первых, это коллекция массивов (не коллекция).

Ваш вопрос заключался в том, как получить конкретную пару ключ-значение в коллекции,

Ответом является функция 'get ()' для коллекции. теперь вы можете просто увеличивать значение "расхода", как показано ниже.

$ads->get($insight[$key])['spend'] += $insight[AdsInsightsFields::SPEND];

NOTE

если вам нужны целые вещи, чтобы быть коллекциями, обновите свой код, чтобы сделать коллекцию коллекций, как показано ниже

$ads->put($insight[$key],  collection([
    'add_id'                            => $insight[AdsInsightsFields::AD_ID],
    'ad_name'                           => $insight[AdsInsightsFields::AD_NAME],
    'ctr'                               => (float)$insight[AdsInsightsFields::CTR],
    'spend'                             => (float)$insight[AdsInsightsFields::SPEND],
]);

, тогда вы можете увеличить стоимость расходов, как показано ниже.

$ads->get($insight[$key])->spend += $insight[AdsInsightsFields::SPEND];
0 голосов
/ 28 сентября 2018

Чтобы решить эту проблему, я написал макросы, способные выполнять необходимые обновления.

// Set a single value by dot notation key.
Collection::macro('set', function ($key, $new) {
    $key = explode('.', $key);
    $primary_key = array_shift($key);
    $key = implode('.', $key);
    $current = $this->get($primary_key);

    if (!empty($key) && is_array($current)) {
        array_set($current, $key, $new);
    } else {
        $current = $new;
    }

    $this->put($primary_key, $current);
});
// Increment a single value by dot notation key.
Collection::macro('increment', function ($key, $amount) {
    $key = explode('.', $key);
    $primary_key = array_shift($key);
    $key = implode('.', $key);
    $current = $this->get($primary_key);

    if (!empty($key) && is_array($current)) {
        $new = array_get($current, $key, 0);
        $new += $amount;

        array_set($current, $key, $new);
    } else {
        $current += $amount;
    }

    $this->put($primary_key, $current);
});
// Decrement a single value by dot notation key.
Collection::macro('decrement', function ($key, $amount) {
    $key = explode('.', $key);
    $primary_key = array_shift($key);
    $key = implode('.', $key);
    $current = $this->get($primary_key);

    if (!empty($key) && is_array($current)) {
        $new = array_get($current, $key, 0);
        $new -= $amount;

        array_set($current, $key, $new);
    } else {
        $current -= $amount;
    }

    $this->put($primary_key, $current);
});

С этим все, что мне нужно сделать, это что-то вроде:

$ads->increment($insight[$key] . '.spend', $insight[AdsInsightsFields::SPEND]);

Если я хочупросто установите значение, независимо от того, существует ключ или нет, я могу сделать это:

$ads->set($insight[$key] . '.spend', $insight[AdsInsightsFields::SPEND]);
0 голосов
/ 27 сентября 2018
$ads->{$insight[$key]}['spend'] +=  $insight[AdsInsightsFields::SPEND];

Это немного странно, но вам нужно получить доступ к первой части как к свойству объекта ->propertyName, это имя свойства, которое вы извлекаете из массива $insight[$key], так что вам, наконец, нужно заключить его в квадратные скобкивам нужно запросить ключ массива этого свойства с [spend] в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...