Member 13720669 Ответов: 2

Обновить конкретное значение ключа в многомерном массиве


я попробовал несколько способов обновления конкретного массива на определенной глубине в многомерном массиве. Хотя я могу обновить, но это не изменяет исходный массив. Несмотря на то, что я попробовал ссылаться на технику php, но, похоже, шансы не в мою пользу.

Что я уже пробовал:

    // Multidimensional array would be as tree 
    // lets call this array = $tree[$i]['child']
    Array
(
    [0] => Array
        (
            [name] => hasan 
            [clientCode] => 06442
            [somekey] => 707
            [individualCommission] => 10
            [child] => Array
                (
                    [0] => Array
                        (
                            [name] => Aslan
                            [clientCode] => 06447
                            [somekey] => 712
                            [individualCommission] => 10
                        )

                    [1] => Array
                        (
                            [name] => Kudret
                            [clientCode] => 06448
                            [somekey] => 713
                            [individualCommission] => 10
                        )

                    [2] => Array
                        (
                            [name] => Emir
                            [clientCode] => 06446
                            [somekey] => 711
                            [individualCommission] => 10
                        )

                )

        )

    [1] => Array
        (
            [name] => emine
            [clientCode] => 06443
            [somekey] => 708
            [individualCommission] => 10
            [child] => Array
                (
                    [0] => Array
                        (
                            [name] => Kaan
                            [clientCode] => 06449
                            [somekey] => 714
                            [individualCommission] => 10
                        )

                    [1] => Array
                        (
                            [name] => Duygu
                            [clientCode] => 06450
                            [somekey] => 715
                            [individualCommission] => 10
                        )

                    [2] => Array
                        (
                            [name] => Hakan
                            [clientCode] => 06451
                            [somekey] => 716
                            [individualCommission] => 10
                        )

                    [3] => Array
                        (
                            [name] => Yesim
                            [clientCode] => 06452
                            [somekey] => 717
                            [individualCommission] => 10
                        )

                )

        )

    [2] => Array
        (
            [name] => Aysel
            [clientCode] => 06444
            [somekey] => 709
            [individualCommission] => 10
            [child] => Array
                (
                    [0] => Array
                        (
                            [name] => Ismet
                            [clientCode] => 06453
                            [somekey] => 718
                            [individualCommission] => 10
                        )

                    [1] => Array
                        (
                            [name] => Suna
                            [clientCode] => 06454
                            [somekey] => 719
                            [individualCommission] => 10
                        )

                    [2] => Array
                        (
                            [name] => Kudriya
                            [clientCode] => 06455
                            [somekey] => 720
                            [individualCommission] => 10
                        )

                )

        )

    [3] => Array
        (
            [name] => Ali
            [clientCode] => 06445
            [somekey] => 710
            [individualCommission] => 10
            [child] => Array
                (
                    [0] => Array
                        (
                            [name] => Gulen
                            [clientCode] => 06456
                            [somekey] => 721
                            [individualCommission] => 10
                        )

                    [1] => Array
                        (
                            [name] => Halit
                            [clientCode] => 06457
                            [somekey] => 722
                            [individualCommission] => 10
                            [child] => Array
                                (
                                    [0] => Array
                                        (
                                            [name] => Seniz
                                            [clientCode] => 06458
                                            [somekey] => 723
                                            [individualCommission] => 10
                                        )

                                    [1] => Array
                                        (
                                            [name] => Güzin
                                            [clientCode] => 06459
                                            [somekey] => 724
                                            [individualCommission] => 10
                                            [child] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [name] => test client
                                                            [clientCode] => 06460
                                                            [somekey] => 725
                                                            [individualCommission] => 10
                                                        )

                                                    [1] => Array
                                                        (
                                                            [name] => test client 2
                                                            [clientCode] => 06461
                                                            [somekey] => 726
                                                            [individualCommission] => 10
                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)


допустим, вышеприведенный массив находится в функции A, и я передал этот вышеприведенный массив, который, скажем, является $tree[$i]['child'], как показано ниже:
function A($tree) {
   $i = 5;
   $childArr = &$tree[$i]['child'];
   $childArr = findandReplace($childArr);
   dump($childArr); // still same nothing changed at that specific index of array 
}


Мне удалось успешно найти конкретный массив с помощью

function findandReplace($array) {

        // Loops through each element. If element again is array, function is recalled. If not, result is echoed.
        foreach($array as $key=>$value)
        { 
            if(is_array($value))
            { 
                findandReplace($value); 
            }
            else{
                if ($key == 'clientCode' && $value == '06459') {
                    // echo $key." = ".$value."<br />\n";
                    $array['individualCommission'] = '10000000000000';                    
                    break;
                }
            } 
        }

        return $array;
    }


Итак, в приведенном выше примере я нацеливался на массив с clientCode = 06459, и если он был найден, я обновлял его индивидуальный ключ Commission до некоторого значения. если я делаю дамп после обновления с помощью $array['individualCommission'] = '10000000000000';, то, похоже, мне удалось успешно обновить его. но, к сожалению, исходный массив все тот же, следовательно, немодифицированный.

Еще одна попытка, которую я сделал, он обновил этот конкретный массив и вернул только этот конкретный массив, и я потерял все остальные массивы многомерного массива.

function findandReplace($array) {    
        $parent = &$array;
        $iterator = new \RecursiveIteratorIterator( new \RecursiveArrayIterator($array), \RecursiveIteratorIterator::SELF_FIRST );
        // $result = array();
        foreach ($iterator as $key => $item) {
            if ( $key === 'clientCode' && $item == '06459') {

                $parent = (array)$iterator->getInnerIterator();
                $parent['individualCommission'] = '1000000000000000';
                // $array[3]['child'][1]['child'][1]['individualCommission'] = $parentCommission;
                break;
            }
        }
        return $array;

    }



поэтому я буду признателен, если кто-нибудь уделит немного времени и найдет какое-нибудь решение этой простой проблемы.

Спасибо!

2 Ответов

Рейтинг:
7

Member 13720669

Ура! наконец-то после 1-дневной борьбы со ссылками он наконец заработал. Я нашел решение этой хитрой проблемы. Хотя я передавал массив в своей функции findandReplace в качестве ссылки, но я также выполнял рекурсию. Он терял ссылку(я полагаю) при нахождении конкретного массива в рекурсии. ответ заключается в том, чтобы поместить 2 Дополнительные ссылки по одной в foreach to

$value
и внешнее стекло отшлифованное или в
findandReplace(&$array)


таким образом, конечная функция будет выглядеть следующим образом

function findandReplace(&$array) {
        foreach($array as $key => &$value)
        { 
            if(is_array($value))
            { 
                findandReplace($value); 
            }
            else{
                
                if ($key == 'clientCode' && $value == '06456') {
                    // echo $key." = ".$value."<br />\n";

                    $array['individualCommission'] = '10000000000000';
                    break;
                }
            } 
        }

        return $array;
    }


Я надеюсь, что это кому-то поможет. не мог найти никакого решения во всем интернете!


Рейтинг:
2

Peter_in_2780

Вам нужно передать массив по ссылке. Это делается в определении findandReplace.
Тебе нужно

function findandReplace(&$array) { 
 ... 
Видеть На PHP: передача по ссылке - инструкция[^]


Member 13720669

Привет, спасибо за комментарий, но если вы видите функцию A, я уже передаю переменную массива в качестве ссылки! видеть это

$childArr = &$tree[$i]['child'];
$childArr = findandReplace($childArr);

хотя я и поставил дополнительный знак & в функцию findandReplace, но это ни на что не повлияло. :(

Peter_in_2780

Нет, вы не передадите его по ссылке, пока не укажете его в определении findandReplace. Прочтите руководство, на которое я ссылался.