преобразование массива в php - PullRequest
2 голосов
/ 09 ноября 2009

как бы вы преобразовали этот массив:

Array
(
    [0] => Array
        (
            [Contact] => Array
                (
                    [number] => 0425 234 634
                )

        )

    [1] => Array
        (
            [Contact] => Array
                (
                    [number] => 2939 492 235
                )

        )

)

в этот массив

Array
(
    [0] => 0425 234 634
    [1] => 2939 492 235
)

Ответы [ 7 ]

7 голосов
/ 10 ноября 2009

См. Set :: extract () Используется нотация xpath для извлечения значений узлов из путей в массивах.

$ numbers = Set :: extract ('/ Contact / number', $ numbers);

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

4 голосов
/ 09 ноября 2009

Поскольку вы используете CakePHP, есть включенная служебная библиотека , которая делает именно то, что вам нужно.

$a = array(
    0 => array(
        'Contact' => array(
                'number' => "0425 234 634"
        )
    ),
    1 => array(
        'Contact' => array(
                'number' => "2939 492 235"
        )
    )
);

$b = Set::classicExtract($a, '{n}.Contact.number');

print_r($b);

И результат:

Array
(
    [0] => 0425 234 634
    [1] => 2939 492 235
)
4 голосов
/ 09 ноября 2009

Очень грязный метод, но не думайте, что есть функция, которая сделает это за вас.

foreach($array1 as $key => $value) {
    $array2[$key]=$value['contact']['number'];
}

EDIT:

На самом деле, array_values ​​ может помочь, стоит проверить его на вашем многомерном массиве.

2 голосов
/ 09 ноября 2009

Я видел только решения, использующие отдельный массив для хранения результатов, это будет работать так же хорошо:

<?php
    foreach($numbers as $key => $number) {
        $numbers[$key] = $number['Contact']['number'];
    }
?>
1 голос
/ 09 ноября 2009

Это должно работать и с

Set:extract( "{n}.Contact.number", $a );
Set::extract( "/number", $a );
1 голос
/ 09 ноября 2009
class DeepCollect {
  protected $arr = array();

  public function collect($item, $key) {
    $this->arr[] = $item;
  }

  public static function collect_all($array) {
    $collect = new self;
    array_walk_recursive($array, array($collect, "collect"));
    return $collect->arr;
  }
}

print_r(DeepCollect::collect_all($input_array));

Будет работать для любого вложенного массива независимо от комбинации клавиш.

1 голос
/ 09 ноября 2009

Вот, пожалуйста, полностью функциональный и без каких-либо предположений относительно вашего исходного массива:)

<?php
$array = array(
    0 => array(
        'Contact' => array(
            'number' => 123123123
        )
    ),
    1 => array(
        'Contact' => array(
            'number' => 123123123
        )
    ),
    2 => array(
        'Contact' => array(
            'number' => 123123123
        )
    ),
);


function flattenArray(array $arr, &$newArr) {
    while($array = array_shift($arr)) {
        if(is_array($array)) {
            flattenArray($array, $newArr);
        } else {
            $newArr[] = $array;
        }
    }
}

$newArr = array();

foreach($array as $key => $value) {
    flattenArray($value, $newArr);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...