У меня есть два массива с объектами в нем. Я хочу сравнить каждое свойство массива друг с другом.
function compare ($array1, $array2)
{
$uniqueArray = array();
for ($i = 0; $i < count($array1); $i++)
{
for ($j = 0; $j < count($array2); $j++)
{
if(levenshtein($array1[$i]->getCompany(), $array2[$j]- >getCompany() > 0 || levenshtein($array1[$i]->getCompany(), $array2[$j]->getCompany()) < 3))
{
//add values to $unqiueArray
}
}
}
print_r($uniqueArray);
}
Я не уверен, что мой код правильный. Итерация по массивам, а затем сравнение — это правильный подход?
Свойства объекта:
private $_company;
private $_firstname;
private $_sirname;
private $_street;
private $_streetnumber;
private $_plz;
private $_place;
Все свойства являются строками.
Вы не должны использовать for (expr1; expr2; expr3)
для итерации массивов; лучше использовать foreach (array_expression as $value)
Кроме того, вы сравниваете каждый элемент в array1 с каждым элементом в array2, но если есть совпадение, вы сравниваете их позже.
Попробуйте что-то вроде этого
foreach($array1 as $k1 => $v1) {
foreach($array2 as $k2 => $v2) {
if(your_condition()) {
$uniqueArray[] = $v1;
unset($array2[$k2])
}
}
}
Или, может быть, сделать некоторые исследования array_uintersect
или же array_walk
if
одна скобка неправильно расставлена, что, вероятно, является главной проблемой и приводит к неожиданным результатам.levenstein
это не тривиальная операция, вы не должны делать это два раза просто для сравнения, лучше сохранить результат в переменной.Вот исправленный код.
function compare ($array1, $array2)
{
$uniqueArray = array();
for ($i = 0; $i < count($array1); $i++)
{
for ($j = 0; $j < count($array2); $j++)
{
$companyNamesLevenstein = levenshtein($array1[$i]->getCompany(), $array2[$j]->getCompany());
if($companyNamesLevenstein > 0 || $companyNamesLevenstein < 3)
{
$uniqueArray [] = $array1[$i];
}
}
}
print_r($uniqueArray);
}