Установить Теорию Союза массивов в PHP

Ошибка NoClassDefFound является туманной ошибкой и часто скрывает более серьезную проблему. Это not такое же, как ClassNotFoundException (которое вызывается, когда класс просто не существует).

NoClassDefFound может указать, что класса нет , как указывают javadocs, но обычно это бросается, когда после того, как загрузчик классов загрузил байты для класса и называет их «defineClass». Также внимательно проверьте свою полную трассировку стека на другие подсказки или возможные «причины» Исключения (хотя ваша конкретная обратная трассировка не показывает ни одного).

Первое, что нужно посмотреть, когда вы получаете NoClassDefFoundError, находится в статических битах вашего класса т.е. любая инициализация, которая имеет место при определении класса. Если это не удастся, он выкинет NoClassDefFoundError - предполагается, что он выкинет ExceptionInInitializerError и укажет детали проблемы, но, по моему опыту, они редки. Он будет выполнять только ExceptionInInitializerError при первом попытке определить класс, после чего он просто выбросит NoClassDefFound. Поэтому посмотрите на более ранние журналы.

Поэтому я бы предложил посмотреть код в этой строке HibernateTransactionInterceptor и посмотреть, что он требует. Похоже, что он не может определить класс SpringFactory. Поэтому, возможно, проверьте код инициализации этого класса, который может помочь. Если вы можете отладить его, остановите его на последней строке выше (17) и отлаживайте, чтобы попытаться найти точную строку, вызывающую исключение. Также проверьте выше в журнале, если вам очень повезло, может быть ExceptionInInitializerError.

29
задан icc97 27 November 2016 в 09:54
поделиться

10 ответов

Попробуйте array_merge:

array_unique(array_merge($array1, $array2));

Руководство по PHP

53
ответ дан adrien 27 November 2016 в 09:54
поделиться

В ответе Адриена нет необходимости создавать последовательно пронумерованный массив из двух последовательно пронумерованных массивов - вот несколько вариантов, которые будут:

array_values(array_unique(array_merge($array1, $array2)));

(ответ Адриена с нумерацией ключей впоследствии)

array_keys(array_flip($array1)+array_flip($array2))

(Поместите значения в ключи и используйте оператор объединения массивов)

array_merge($array1, array_diff($array2, $array1))

(Удалите общие значения из второго массива перед объединением)

Результаты тестов (для объединение двух массивов длиной 1000 в моей системе тысячу раз):

  • Уникальный (версия Адриена): 2.862163066864 секунды
  • Значения_Уникальный: 3,12 секунды
  • Keys_Flip: 2,34 секунд
  • Merge_Diff: 2,64 секунды

Тот же тест, но с двумя очень похожими массивами (по крайней мере, 80% дублируются):

  • Уникальный ( Версия Адриена): 2,92 секунды
  • Значения_Уникация: 3,15 секунды
  • Keys_Flip: 1,84 секунды
  • Merge_Diff: 2,36 секунды

Кажется, используя массив оператор союза, чтобы сделать ctual union - самый быстрый метод. Однако обратите внимание, что array_flip безопасен, только если значения массива - это все строки или все целые числа; если вам нужно произвести объединение массива объектов, я рекомендую версию с array_merge и array_diff.

8
ответ дан Brilliand 27 November 2016 в 09:54
поделиться
$result = array_merge_recursive($first, $second);

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

1
ответ дан ackuser 27 November 2016 в 09:54
поделиться

Оператор +:

$x[0] = 4;
$x[1] = 1;

$y[0] = 9;
$y[2] = 5;

$u = $y + $x;

// Results in:
$u[0] === 9;
$u[1] === 1;
$u[2] === 5;

Обратите внимание, что $x + $y! = $y + $x

0
ответ дан Paulpro 27 November 2016 в 09:54
поделиться

Из кода в документации PHP: Операторы массивов :

<?php
$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");

$c = $a + $b; // Union of $a and $b
echo "Union of \$a and \$b: \n";
var_dump($c);

$c = $b + $a; // Union of $b and $a
echo "Union of \$b and \$a: \n";
var_dump($c);
?>

При выполнении этот скрипт выведет следующее:

Union of $a and $b:
array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  string(6) "cherry"
}
Union of $b and $a:
array(3) {
  ["a"]=>
  string(4) "pear"
  ["b"]=>
  string(10) "strawberry"
  ["c"]=>
  string(6) "cherry"
}
4
ответ дан icc97 27 November 2016 в 09:54
поделиться

Используйте array_unique и array_merge вместе.

5
ответ дан Oscar 27 November 2016 в 09:54
поделиться

используйте оператор «+» для этого. Смотрите ссылку Array Operators

4
ответ дан RJ Anoop 27 November 2016 в 09:54
поделиться

array_unique( array_merge( ... ) )

11
ответ дан Brian 27 November 2016 в 09:54
поделиться

Просто используйте $array1 + $array2 Это приведет к объединению обоих массивов.

0
ответ дан Altaf Hussain 27 November 2016 в 09:54
поделиться

OP не определил, является ли объединение [1 124] значение или [1 125], ключ и PHP имеет array_merge для слияния значений и + для слияния ключей. Результаты зависят от того, индексируется ли массив или ввел и , какой массив на первом месте.

$a = ['a', 'b'];
$b = ['b', 'c'];

$c = ['a' => 'A',  'b' => 'B'];
‌‌$d = ['a' => 'AA', 'c' => 'C'];

Индексный массив

Видит array_merge

значением с помощью array_merge

‌‌array_merge($a, $b); // [‌0 => 'a', 1 => 'b', 2 => 'b', 3 => 'c']
‌‌array_merge($b, $a); // ‌[0 => 'b', 1 => 'c', 2 => 'a', 3 => 'b']

слияние ключом с помощью +, оператор

Видит + оператор

‌‌$a + $b; ‌// [0 => 'a', 1 => 'b']
$b + $a; // [0 => 'b', 1 => 'c']

Включенный массив

значением с помощью [1 111]

‌array_merge($c, $d); // ‌['a' => 'AA', 'b' => 'B', 'c' => 'C']
array_merge($d, $c); // ['a' => 'A',  'c' => 'C', 'b' => 'B']

слияние ключом с помощью [1 112] оператор

$c + $d; // [‌'a' => 'A',  'b' => 'B', 'c' => 'C']
‌‌$d + $c; // ‌['a' => 'AA', 'c' => 'C', 'b' => 'B']
0
ответ дан 27 November 2019 в 23:13
поделиться
Другие вопросы по тегам:

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