Удалить родительский элемент многомерного массива? - PullRequest
0 голосов
/ 23 марта 2012

Мой массив выглядит так:

    Array ( 

      [Team] => Array ( 

        [0] => Array ( 

          [Name] => Team A [Played] => 0 [Wins] => 0 [Draws] => 0 [Losses] => 0 [Gd] => 0 [Points] => 0 ) 

        [1] => Array ( 

          [Name] => Team B [Played] => 0 [Wins] => 0 [Draws] => 0 [Losses] => 0 [Gd] => 0 [Points] => 0 ) ) )

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

Ответы [ 3 ]

0 голосов
/ 23 марта 2012

Мне самому всегда нравится использовать цикл foreach вместо того, чтобы считать и использовать цикл for. Просто мои предпочтения. Кроме того, в одном из предыдущих ответов было рекомендовано использовать array_splice, однако здесь unset работает лучше - если только вы не хотите поместить удаленную команду в новый массив, для которого обычно используется array_splice. Я полагаю, что Unset сэкономит память.

$remove = 'Team A';    
foreach ($teams['Team'] as $key => $team) {
    if($team['Name'] == $remove){
       unset($teams['Team'][$key]);
    }        
}
0 голосов
/ 23 марта 2012

"XML, в основном я хочу обновить значения команд, но мне проще вставить новый массив в конец и просто удалить старый" - это может быть таким же простым, как

<?php
$foo = new SimpleXMLElement(getData());
foreach( $foo->xpath('teams/team[@name="Team A"]') as $t) {
    $t->wins += 1;
}
echo $foo->asxml();


function getData() {
    return <<< eox
<foo>
    <teams>
        <team name="Team A">
            <played>0</played>
            <wins>0</wins>
            <draws>0</draws>
            <looses>0</looses>
        </team>
        <team name="Team B">
            <played>0</played>
            <wins>0</wins>
            <draws>0</draws>
            <looses>0</looses>
        </team>
    </teams>
</foo>  
eox;
}

печать

<?xml version="1.0"?>
<foo>
    <teams>
        <team name="Team A">
            <played>0</played>
            <wins>1</wins>
            <draws>0</draws>
            <looses>0</looses>
        </team>
        <team name="Team B">
            <played>0</played>
            <wins>0</wins>
            <draws>0</draws>
            <looses>0</looses>
        </team>
    </teams>
</foo>
0 голосов
/ 23 марта 2012

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

$lastIndex = count($arr['Team'])-1;
for($i=$lastIndex; $i>=0; $i--) {
    if($arr['Team'][$i]['Name'] == 'Team A') {
        array_splice($arr['Team'], $i, 1);
    }
}

Вы также можетеиспользуйте unset:

$lastIndex = count($arr['Team'])-1;
for($i=$lastIndex; $i>=0; $i--) {
    if($arr['Team'][$i]['Name'] == 'Team A') {
        unset($arr['Team'][$i]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...