PHP - Разница между многомерными массивами [duplicate]

В целом, это не сработает, потому что point не является subpoint; верно только обратное. Однако есть и другие проблемы.

В порядке:


subpoint* b = dynamic_cast<subpoint*>(&a);

dynamic_cast работает только с полиморфными типами, то есть с типами, объявляющими хотя бы одну виртуальную функция. Я предполагаю, что point не имеет виртуальных функций, что означает, что он не может использоваться с dynamic_cast.


subpoint* b = (subpoint*)a;

Для этого приведения к работе point необходимо объявить преобразование оператор subpoint *, например point::operator subpoint *().


subpoint b = (subpoint)a;

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

4
задан AbraCadaver 12 April 2017 в 16:15
поделиться

3 ответа

Чтобы проверить многопоточность, попробуйте что-то вроде этого:

$pageWithNoChildren = array_map('unserialize',
    array_diff(array_map('serialize', $pageids), array_map('serialize', $parentpage)));
  • array_map() запускает каждую подматрицу основных массивов через serialize()
  • serialize() преобразует каждый вспомогательный массив в строковое представление этого подматрица
  • , теперь основные массивы имеют значения, которые не являются массивами, а строковыми представлениями подмассивов
  • array_diff() теперь имеет одномерный массив для каждого из массивов для сравнения
  • после того, как разница возвращается array_map() запускает результат массива (различия) через unserialize(), чтобы превратить представления строк обратно в суб- массивы

QED

13
ответ дан AbraCadaver 16 August 2018 в 03:53
поделиться
  • 1
    это так здорово! Спасибо! В стороне я не думаю, что вы могли бы дать краткое объяснение этого, пожалуйста, пожалуйста? Я раньше не использовал unserialize или array_maps, и я смотрю их сейчас, но если бы вы могли быстро запустить, это было бы потрясающе, в любом случае спасибо снова! – Smokescreen 12 March 2014 в 17:04
  • 2
    Я думаю, что, возможно, я нашел ответ так, чтобы другие читали это, и кому интересно. Я считаю, что serialize () превращает PHP-ключи и значения в строку, поэтому у вас есть строка во всех массивах $ pageids и строка во всех массивы $ parentpages. Функция array_diff может затем сравнить эти строки и выделить те, которые находятся в $ pageids, а не в $ parentpages, а затем результат преобразуется обратно в php vales, используя unserialize (). Именно то, что мне нужно! Еще раз спасибо! :) – Smokescreen 12 March 2014 в 17:19
  • 3
    Благодаря! Я только что прочитал ваш шаг за шагом, а также нашел документацию и то, что вы сказали, это то, что я понял из того, что я прочитал, так что похоже, что у меня есть это :) Еще раз спасибо, это было здорово! – Smokescreen 12 March 2014 в 17:22
  • 4
    хороший ответ, но это предполагает, что ассоциативные массивы отсортированы одинаково (ассоциативные ключи в одном порядке), иначе это не будет работать так, как ожидалось ... – qdev 7 August 2016 в 11:49
  • 5
    Этот метод мне очень помог, но в моем случае я должен был заботиться о типе данных каждого элемента в массиве, когда массив его сериализован, мой идентификатор в одном массиве был int и string в другом, поэтому совпадения не были найдены. – Antonycx 26 October 2017 в 21:55

Правый путь https://github.com/yapro/helpers/blob/master/src/ArrayHelper.php

class ArrayHelper
{
    /**
     * @param array $array1
     * @param array $array2
     * @return array
     */
    function arrayDiffAssocMultidimensional(array $array1, array $array2): array
    {
        $difference = [];
        foreach ($array1 as $key => $value) {
            if (is_array($value)) {
                if (!array_key_exists($key, $array2)) {
                    $difference[$key] = $value;
                } elseif (!is_array($array2[$key])) {
                    $difference[$key] = $value;
                } else {
                    $multidimensionalDiff = $this->arrayDiffAssocMultidimensional($value, $array2[$key]);
                    if (count($multidimensionalDiff) > 0) {
                        $difference[$key] = $multidimensionalDiff;
                    }
                }
            } else {
                if (!array_key_exists($key, $array2) || $array2[$key] !== $value) {
                    $difference[$key] = $value;
                }
            }
        }
        return $difference;
    }
}
0
ответ дан Lebnik 16 August 2018 в 03:53
поделиться

Очень приятное решение от @AbraCadaver, но, как я уже сказал в комментариях, могут быть случаи, когда элементы ассоциативных массивов не везде одинаковы, поэтому настраиваемая функция будет сортировать их по индексу / ключу сначала удобно:

function sortAndSerialize($arr){
    ksort($arr);
    return serialize($arr);
}

array_map('unserialize', array_diff(array_map('sortAndSerialize', $pageids), array_map('sortAndSerialize', $parentpage)));
1
ответ дан qdev 16 August 2018 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: