iNickolay
@iNickolay

Как заменить значение в многомерном массиве?

Приветствую! Что-то не сообразить, может подскажет кто?)
Имеем массив
Array
(
    [0] => Array
        (
            [result] => a
            [components] => Array
                (
                    [0] => 2
                    [1] => 41
                )

            [formula] => 2+41
            [answer] => 43
        )

    [1] => Array
        (
            [result] => d
            [components] => Array
                (
                    [0] => a
                    [1] => 1
                )

            [formula] => a-1
            [answer] => 
        )

)

необходимо проверить, есть ли в [components] один из [result] (предыдущих индексов) и при совпадении заменить найденый component в [formula] на [answer].
Т.е. в данном случае необходимо что бы получилось вместо [formula] => a-1 это: [formula] => 43-1

Прошу прощения за сумбурность, если не понятно - постараюсь перефразировать. Надеюсь на вашу помощь! )
  • Вопрос задан
  • 1469 просмотров
Решения вопроса 1
@a_ovchinnikov
Web developer
Если я вас правильно понял, то что-то вроде этого:

<?php

$arr = [
    [
        'result' => 'a',
        'components' => [
            2,
            41
        ],
        'formula' => '2 + 41',
        'answer' => 43
    ],
    [
        'result' => 'd',
        'components' => [
            'a',
            1
        ],
        'formula' => 'a - 1',
        'answer' => ''
    ]
];

$resultArr = doReplacement($arr);
var_dump($resultArr);

function doReplacement(array $arr)
{
    foreach ($arr as &$item)
    {
        $components = &$item['components'];
        $formula = &$item['formula'];
        foreach ($components as &$component)
        {
            if (!is_numeric($component))
            {
                $value = findComponentValue($arr, $component);
                $formula = str_replace($component, $value, $formula);

                $component = $value;
            }
        }

        if (empty($item['answer']))
        {
            // calculate formula
        }
    }

    return $arr;
}

function findComponentValue(array $arr, $component)
{
    $value = 0;
    foreach ($arr as $item)
    {
        $result = $item['result'];
        if ($result == $component)
        {
            $value = intval($item['answer']);
        }
    }

    return $value;
}


Сам код подсчета формулы я писать не стал. Быстрое решение - с использованием eval, но это большое зло. По уму нужно парсить строку и вычислять значение. Возможно вот эта ссылочка сможет помочь stackoverflow.com/questions/18880772/calculate-mat...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
bazilio2010
@bazilio2010
Мужчина
$arr[1][formula] ='43-1';

Заменит значение можно примерно так )
Ответ написан
prototype_denis
@prototype_denis
Symfony
<?php

// $array = [...];
for ($current = 0, $length = count($array); $current < $length; ++$current) {
    for ($preview = $current - 1; $preview >= 0; --$preview) {
        if (false !== $key = array_search($array[$preview]['result'], $array[$current]['components'], true)) {
            $array[$current]['formula'] = str_replace($array[$current]['components'][$key], $array[$preview]['answer'], $array[$current]['formula']);
        }
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы