2015-04-06 3 views
0

Я работаю с массивом, таким как следующее, и я хотел бы установить все «ценные» ключи, которые не имеют значения, до 0.(многомерный массив) Измените все значения, где указатель является определенной строкой

Как я могу достичь этого, если глубина массива бесконечна?

Большое спасибо!

Array 
(
    [0] => Array 
    (
     [random_key0] => Array 
      (
       [name] => Foo 
       [price] => 25 
      ) 

     [random_key1] => Array 
      (
       [name] => Bar 
       [price] => 
      ) 
    [1] => Array 
    (
     [name] => 125 
     [price] => 
    ) 
    [2] => Array 
    (
     [another_key0] => Array 
      (
       [name] => Foo 
       [options] => Options here 
       [special0] => Array 
        (
         [name] => Special Name 
         [price] => 
        ) 

       [special1] => Array 
        (
         [name] => Special 2 
         [price] => 120 
        ) 

      ) 
     ) 
) 
+0

Я могу порекомендовать вам вместо того, чтобы зацикливать его на то, чтобы выставить цены на int/float, когда вы его используете. Пусто будет 0 .. – Svetoslav

+0

Откуда вы получаете исходные данные? Это было бы намного легче сделать. Или даже на дисплее, если это сработает. –

ответ

0

Вы можете использовать array_walk_recursive, например так:

<?php 
function update_price(&$item, $key) { 
    if ($key == 'price' && !$item) { 
     $item = 0; 
    } 
} 
$test = array('key1' => array('price' => null, 'test' => 'abc', 'sub' => array('price' => 123), 'sub2' => array('price' => null))); 
array_walk_recursive($test, 'update_price'); 
print_r($test); 
+0

Это прекрасно работает, спасибо! – Philex

1

Вы бы сделать это с помощью функции «ходить», которая называет себя, пока все элементы не будут проработаны:

<?php 
$test = array(
    array(
     "random_key0" => array("name"=>"foo","price"=>25), 
     "random_key1" => array("name"=>"Bar","price"=>"") 
    ), 
    array("name"=>125,"price"=>""), 
    array("another_key0" => array(
     "name" => "foo", 
     "options" => "Options here", 
     "special0" => array("name"=>"Special Name","price"=>""), 
     "special1" => array("name"=>"Special 2","price"=>120), 
    )) 
); 

function test_alter(&$item, $key) 
{ 
    if ($key=="price" && empty($item)) 
     $item = 0; 
} 

function test_print($item2, $key) 
{ 
    echo "$key. $item2<br>\n"; 
} 

echo "Before ...:\n"; 
array_walk_recursive($test, 'test_print'); 

// now actually modify values 
array_walk_recursive($test, 'test_alter'); 

echo "... and afterwards:\n"; 
array_walk_recursive($test, 'test_print'); 
?> 

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

Смежные вопросы